题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822
题目意思:
在一个长为L的木棒上有n只蚂蚁,告诉每只蚂蚁的开始位置和开始运动方向,蚂蚁的速度都为单位长度每秒,求经过T秒后每只蚂蚁的运行情况。
若多只蚂蚁正相遇转向输出Turning
向右输出R,向左输出L,如果走出了木棒输出Fell off
解题思路:
这题是这题的升华版:http://blog.csdn.net/cc_again/article/details/18042929
关键理解两点:1、当蚂蚁相遇时,可以等价看成是蚂蚁交叉行进,这样的话可以把最终的位置和该位置的方向的(谢谢峰峰帮助)确定。
2、蚂蚁的相对位置是固定的,位置大的肯定是最右边的蚂蚁占据。
代码:
//#include<CSpreadSheet.h> #include<iostream> #include<cmath> #include<cstdio> #include<sstream> #include<cstdlib> #include<string> #include<string.h> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<list> #include<queue> #include<ctime> #include<bitset> #define eps 1e-6 #define INF 0x3f3f3f3f #define PI acos(-1.0) #define ll __int64 #define LL long long #define lson l,m,(rt<<1) #define rson m+1,r,(rt<<1)|1 #define M 1000000007 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define Maxn 11000 int l,n,t; struct SS { int gol,dd; }save[Maxn]; //dd=0表示向右 1表示向左 2表示正在相遇 3表示掉下去喽 struct Inf { int pos,pp; }inf[Maxn]; bool cmp1(struct SS a,struct SS b) { return a.gol>b.gol; } bool cmp2(struct Inf a,struct Inf b) { return a.pos>b.pos; } int ans[Maxn],dir[Maxn]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int tt; scanf("%d",&tt); for(int ca=1;ca<=tt;ca++) { scanf("%d%d%d",&l,&t,&n); for(int i=1;i<=n;i++) { int cur; char temp[3]; scanf("%d%s",&cur,temp); inf[i].pos=cur; //初始位置 inf[i].pp=i; //原始位置下标 if(*temp=='L') { save[i].gol=cur-t; //一只蚂蚁的最终位置 save[i].dd=1; //与该位置对应的方向 } else { save[i].gol=cur+t; save[i].dd=0; } } sort(save+1,save+n+1,cmp1); //对最终的位置从大到小排序 sort(inf+1,inf+n+1,cmp2); //对蚂蚁的原始位置从大到小排序 for(int i=1;i<=n;i++) //逐个处理 { if(save[i].gol>l||save[i].gol<0) //出了棒,掉下去喽 dir[inf[i].pp]=3; else { int j=i+1; //尝试是否有相同的 while(j<=n&&save[j].gol==save[i].gol) j++; j--; if(j!=i) //有多个蚂蚁的最终位置一样,相遇 { while(i!=j+1) //标注 所有蚂蚁的该位置 { ans[inf[i].pp]=save[i].gol; dir[inf[i].pp]=2; i++; } i--; } else //不是相遇位置 { ans[inf[i].pp]=save[i].gol; dir[inf[i].pp]=save[i].dd; } } } printf("Case #%d:\n",ca); for(int i=1;i<=n;i++) { if(dir[i]==3) printf("Fell off\n"); else { printf("%d ",ans[i]); if(!dir[i]) printf("R\n"); else if(dir[i]==1) printf("L\n"); else printf("Turning\n"); } } printf("\n"); } return 0; }