UVA 10881 - Piotr's Ants【模拟+思维】
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822
题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向。并且当相邻两个蚂蚁相撞时转向。现在问t时间后各个蚂蚁的位置。
解法:这题的一个致命技巧就是把两只蚂蚁的相撞看作是两只蚂蚁交换穿过对方并且交换蚂蚁的编号。这个是很好理解的,类似于物理的完全弹性碰撞。又由于任何两只蚂蚁的相对位置在这种转弯的情况下不会改变相对位置,因此我们只要视作所有蚂蚁没有蚂蚁的行动。最后根据位置关系对应到原始的位置关系。最后再做位置判断的时候查看是否超出坐标之外即可。
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10000+5; 4 struct Ant 5 { 6 int id;//顺序 7 int p;//位置 8 int d;//转向,-1表示左,0表示碰撞中,1表示右 9 bool operator <(const Ant& a)const 10 { 11 return p<a.p; 12 } 13 }before[maxn],after[maxn]; 14 const char dirName[][10]={"L","Turning","R"}; 15 int order[maxn];//输入的第i只蚂蚁是终态中的左数第order[i]只蚂蚁 16 int main() 17 { 18 int K; 19 scanf("%d",&K); 20 for(int kase=1;kase<=K;kase++) 21 { 22 int L,T,n; 23 scanf("%d%d%d",&L,&T,&n); 24 for(int i=0;i<n;i++) 25 { 26 int p,d; 27 char c; 28 scanf("%d %c",&p,&c); 29 d=(c=='L'?-1:1); 30 before[i]=(Ant){i,p,d}; 31 after[i]=(Ant){0,p+T*d,d};//所有的蚂蚁相撞后可以看做对穿而过,这里的id是未知的 32 } 33 printf("Case #%d:\n",kase); 34 //计算order数组 35 sort(before,before+n); 36 for(int i=0;i<n;i++)//最巧妙的地方在这里,第一次从左到右所有的蚂蚁的相对位置没有变化 37 order[before[i].id]=i; 38 //计算终态 39 sort(after,after+n); 40 for(int i=0;i<n-1;i++)//修改碰撞中的蚂蚁的方向 41 if(after[i].p==after[i+1].p) 42 after[i].d=after[i+1].d=0; 43 //输出结果 44 for(int i=0;i<n;i++) 45 { 46 int a=order[i]; 47 if(after[a].p<0||after[a].p>L) 48 printf("Fell off\n"); 49 else printf("%d %s\n",after[a].p, dirName[after[a].d+1]); 50 } 51 printf("\n"); 52 } 53 return 0; 54 }
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注我的微信公众号IT老实人(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯咖啡以资鼓励,您的肯定将是我最大的动力。thx.
我的公众号是IT老实人(IThonest),一个有故事的公众号,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!
欢迎大家关注我的Github,一些文章的备份和平常做的一些项目会存放在这里。