UVA10881 Piotr's Ants
思路
发现蚂蚁之间的相对位置不变
所以计算出最后的位置,再把编号分配进去即可
注意掉下去的条件是pos<0
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int N,n,L,T,pos[10100],to[10100],num[10100],is[10100],getss[10100],inq;
struct Node{
int pos,to,id;
}a[10100];
bool cmp2(Node a,Node b){
return a.pos<b.pos;
}
int main(){
scanf("%d",&N);
while(N--){
inq++;
memset(is,0,sizeof(is));
scanf("%d %d %d",&L,&T,&n);
for(int i=1;i<=n;i++){
scanf("%d",&pos[i]);
a[i].pos=pos[i];
char c=getchar();
while(c!='L'&&c!='R')
c=getchar();
num[i]=i;
if(c=='L')
to[i]=0;
else
to[i]=1;
a[i].to=to[i];
a[i].id=i;
}
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=n;i++)
pos[i]=a[i].pos,to[i]=a[i].to,num[i]=a[i].id;
for(int i=1;i<=n;i++){
if(to[i]==0)
for(int j=i-1;j>=1;j--){
if(to[j]==1&&pos[j]+T>=pos[i]-T)
swap(num[i],num[j]);
}
}
for(int i=1;i<=n;i++)
if(to[i]==0){
pos[i]-=T;
}
else{
pos[i]+=T;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
if(pos[i]==pos[j])
is[num[i]]=3;
for(int i=1;i<=n;i++){
if(pos[i]<0||pos[i]>L)
is[num[i]]=2;
else{
if(is[num[i]]!=3)
is[num[i]]=to[i];
getss[num[i]]=pos[i];
}
}
printf("Case #%d:\n",inq);
for(int i=1;i<=n;i++){
if(is[i]==3){
printf("%d Turning\n",getss[i]);
}
else if(is[i]==2){
printf("Fell off\n");
}
else{
printf("%d %c\n",getss[i],(is[i])?'R':'L');
}
}
printf("\n");
}
return 0;
}