一开始想着写个大循环,按照时间每0.5秒增加来算,实在是写不懂了,去看评论区发现还是需要画图琢磨一下各种情况,是有规律的。。
借用大佬@想吃芒果冰啊 的思路和@183610班曲超 的代码,整理一下思路。
0、除A以外的其他蚂蚁,因为改变方向在感官看起来相当于擦肩而过,所以假设它们相遇不交换速度。
1、由于蚂蚁A左侧向左的蚂蚁和右侧向右的蚂蚁与A不会发生相撞,所以仅考虑左侧向右的蚂蚁和右侧向左的蚂蚁。
2、记left、right分别为向左和向右的蚂蚁数
3、left < right时,A落地的时间相当于左侧第right-left个蚂蚁(从1开始计数)一路向右坠落的时间。
4、left > right时,A落地的时间相当于最右侧蚂蚁一路向左落地的时间,即它一开始的位置。
(3、4画几个图很容易就能看出来规律了)

#include<stdio.h>
#include<stdlib.h>
struct ant
{
    int loc;
    int v;
} buf[100];
int pleft[100],pright[100]; // pleft指右侧向左的蚂蚁,pright指左侧向右的蚂蚁

int cmp(const void *a,const void *b) // 给蚂蚁按照从小到大的位置排序
{
    return ((struct ant*)a)->loc-((struct ant*)b)->loc;

}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i,j,k;
        int left=0,right=0; // left指右侧向左的蚂蚁数,right指左侧向右的蚂蚁数
        for(i=0; i<n; i++)
            scanf("%d%d",&buf[i].loc,&buf[i].v);
        qsort(buf,n,sizeof(struct ant),cmp);
        for(i=0;i<n;i++)
        {
            if(buf[i].v==0)
            {
                k=i;
                break;
            }
        }
        for(i=0;i<k;i++)
        {
            if(buf[i].v==1)
            {
               pright[right++]=buf[i].loc;
            }
        }
        for(i=k+1;i<n;i++)
        {
            if(buf[i].v==-1)
            {
                pleft[left++]=buf[i].loc;
            }
        }
        if(left==right)
        {
            printf("Cannot fall!\n");
            continue;
        }
        else if(left>right)
        {
            printf("%d\n",pleft[right]);
        }
        else
        {
            printf("%d\n",100-pright[right-left-1]);
        }
    }
}