一开始想着写个大循环,按照时间每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]); } } }