uva 10881 Piotr's Ants
Posted Omz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 10881 Piotr's Ants相关的知识,希望对你有一定的参考价值。
https://vjudge.net/problem/UVA-10881
题意:
一根长为L cm的木棍上有很多只蚂蚁,他们的速度为1cm每秒,他们的有的向右,有的向左。当两只蚂蚁相撞的时候,他们各自掉头往回走,碰撞的时间可以忽略不记。
现在给出若干只蚂蚁起始时刻的位置和方向,问经过t秒钟后,这些蚂蚁的位置和朝向。
思路:
很脑洞的一道题,如果我们忽略蚂蚁的编号就可以发现,每只蚂蚁是没有区别的,即两只蚂蚁的碰撞可以看成他们直接穿过。
那么我们就可以方便的计算每只蚂蚁的最终位置了。
之后需要想到的是,不忽略每只蚂蚁的编号那么每只蚂蚁的顺序是固定的(这个需要好好理解),因为一只蚂蚁如果位于两只蚂蚁的中间,如果他们不相撞,那么肯定始终是在中间的;如果相撞的话,就一直来回来回的碰碰碰。。。。2333
所以是一直在中间的,那么这方便我们计算每只蚂蚁经过t时刻之后的朝向,这可以看成是每只蚂蚁状态的传递。
由于输入的时候不是按照从左到右的顺序输入的,所以我们需要用一个数组来保存位置。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 struct node 7 { 8 int id; 9 int p; 10 int sta; 11 12 bool operator < (const node& rhs) const 13 { 14 return p < rhs.p; 15 } 16 } before[10005],after[10005]; 17 18 int ord[10005]; 19 20 int main() 21 { 22 int cas; 23 24 scanf("%d",&cas); 25 26 for (int k = 1;k <= cas;k++) 27 { 28 int l,t,n; 29 30 scanf("%d%d%d",&l,&t,&n); 31 32 for (int i = 0;i < n;i++) 33 { 34 int p; 35 char c; 36 int d; 37 38 scanf("%d %c",&p,&c); 39 40 if (c == ‘R‘) d = 1; 41 else d = -1; 42 43 before[i] = node{i,p,d}; 44 after[i] = node{-1,p + t * d,d}; 45 } 46 47 sort(before,before + n); 48 49 for (int i = 0;i < n;i++) 50 ord[before[i].id] = i; 51 52 sort(after,after + n); 53 54 for (int i = 0;i < n - 1;i++) 55 { 56 if (after[i].p == after[i+1].p) after[i].sta = after[i+1].sta = 0;//正在相撞 57 } 58 59 printf("Case #%d:\n",k); 60 61 for (int i = 0;i < n;i++) 62 { 63 int j = ord[i]; 64 65 if (after[j].p < 0 || after[j].p > l) printf("Fell off\n"); 66 else if (after[j].sta == -1) printf("%d %s\n",after[j].p,"L"); 67 else if (after[j].sta == 1) printf("%d %s\n",after[j].p,"R"); 68 else printf("%d %s\n",after[j].p,"Turning"); 69 } 70 71 printf("\n"); 72 } 73 74 return 0; 75 }
以上是关于uva 10881 Piotr's Ants的主要内容,如果未能解决你的问题,请参考以下文章