感觉很巧妙的一道题 之前比赛做过一道题与这个类似 当时没想出来
很多蚂蚁在一条线上走 对撞之后改变方向 问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 }