UVA10881Piotr's Ants

感觉很巧妙的一道题 之前比赛做过一道题与这个类似 当时没想出来

很多蚂蚁在一条线上走 对撞之后改变方向 问T时间之后 蚂蚁分别在哪里 蚂蚁都是一样的 可以把蚂蚁看做一个点 对撞的时候 可以看做穿过 这样T之后哪些点有蚂蚁就知道了 就是不知道这个点的原点是哪个 可以把输入的点排序 因为相对顺序是不变的 就知道这个点原来是哪个了

不知道为嘛一直交不对 重新打了一遍 就A了

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 
 7 using namespace std;
 8 struct node
 9 {
10     int id,p,d;
11 }before[10010],after[10010];
12 char dir[][100] = {"L","Turning","R"};
13 int order[10010];
14 bool cmp(node a,node b)
15 {
16     return a.p<b.p;
17 }
18 int main()
19 {
20     int i,j,k,n,m,ll,t;
21     char c;
22     cin>>m;
23     for(j = 1; j <= m ; j++)
24     {
25         cin>>ll>>t>>n;
26         for(i = 0 ; i < n ; i++)
27         {
28             cin>>k>>c;
29             int y = (c=='L'?-1:1);
30             before[i] = (node){i,k,y};
31             after[i] = (node){0,k+y*t,y};
32         }
33         sort(before,before+n,cmp);
34         sort(after,after+n,cmp);
35         printf("Case #%d:\n",j);
36         for(i = 0 ; i < n ; i++)
37         order[before[i].id] = i;
38         for(i = 0 ; i < n-1 ; i++)
39         if(after[i].p==after[i+1].p)
40         after[i].d = after[i+1].d = 0;
41         for(i = 0 ; i < n ; i++)
42         {
43             int a = order[i];
44             if(after[a].p<0||after[a].p>ll)
45             puts("Fell off");
46             else
47             printf("%d %s\n",after[a].p,dir[after[a].d+1]);
48         }
49         puts("");
50     }
51     return 0;
52 }

 

posted @ 2013-04-24 11:54  _雨  阅读(160)  评论(0编辑  收藏  举报