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