UVA 10881 Piotr's Ants

来源:互联网 发布:weego我去旅行 知乎 编辑:程序博客网 时间:2024/06/03 20:48

分析:根据题意,每两只蚂蚁相遇后就会各自调头,那么蚂蚁的位置排序是不变的;

什么意思呢?例如一排蚂蚁编号1-5,无论怎样运动,改变的只是位置(相遇后会调头),但第一个位置仍然是1号蚂蚁,最后一个位置仍然是5号蚂蚁。

注意题目给的数据位置并不是从大到小的,所以要按照位置的先后将蚂蚁排一次序;

想象一下,如果两只蚂蚁相遇后会调头和近似的看做两只蚂蚁对穿而过是不是一样的?

给出数据:1号蚂蚁在6向右,二号蚂蚁在3向左,3号蚂蚁在8向左;

根据位置排序后如下图:


现在的蚂蚁位置从左到右是2,1,3

2秒后计算出三个位置,分别是:位置1向右运动,位置 6向左运动 ,位置8向右运动;


位置从左到右不变,给三个位置加上编号:

注意定义结构体时要保存输入的顺序,因为按照位置排序后次序与原来的输入次序不一样

而答案需按照输入的顺序输出,所以一切确定后还要按照输入的顺序排一次序,按输入的次序输出答案


代码:

#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int M=10005;struct ant{int id,pos,op,fin;}s[M];int x[M];struct lin{int x;int y;}l[M];bool cmp(const ant&a,const ant&b){return a.id<b.id;}bool cmp1(const ant&a,const ant&b){return a.pos<b.pos;}bool cmp2(const lin&a,const lin&b){return a.x<b.x;}int main(){int i,t;cin>>t;for(int i=1;i<=t;i++){memset(x,0,sizeof(x));int L,T,n;char c;cin>>L>>T>>n;for(int q=0;q<n;q++){cin>>s[q].pos;cin>>c;if(c=='R')s[q].op=1;else s[q].op=-1;s[q].id=q;l[q].x=s[q].pos+T*s[q].op;l[q].y=s[q].op;}sort(s,s+n,cmp1);sort(l,l+n,cmp2);for(int q=0;q<n;q++){if(l[q].x<0||l[q].x>L)s[q].fin=0;else if(q==0&&l[q].x==l[q+1].x)s[q].fin=1;else if(q!=0&&(l[q].x==l[q-1].x||l[q].x==l[q+1].x))s[q].fin=1;else s[q].fin=2;s[q].pos=l[q].x;s[q].op=l[q].y;} sort(s,s+n,cmp);cout<<"Case #"<<i<<":"<<endl;for(int q=0;q<n;q++){if(s[q].fin==0)cout<<"Fell off"<<endl;else if(s[q].fin==2){cout<<s[q].pos<<" ";if(s[q].op==1)cout<<"R"<<endl;else cout<<"L"<<endl;}else if(s[q].fin==1)cout<<s[q].pos<<" "<<"Turning"<<endl;}cout<<endl;}return 0;}