您的位置:首页 > 大数据 > 物联网

UVa --- 10881 Piotr's Ants 【思维】

2017-08-23 10:05 302 查看
传送门

//题意:给出一根长度为L的木棒上n只蚂蚁的初始坐标和运动方向, 速度是1cm/s,问T秒后每只蚂蚁的所在位置的情况和运动方向, 如果两只蚂蚁在运动中碰头了, 则这两只蚂蚁立刻掉头(不计时间), T秒后如果蚂蚁掉下木棒输出”Fell off”, 正在掉头输出”Turning”.

//这道题就很考思维了, 其实我们可以发现对于有一只蚂蚁起始为(1,R), 那么两秒后一定在(3,R) 出有一只蚂蚁, 如果没有碰头那么那只蚂蚁就是原先那只, 否则就是与这只蚂蚁碰了头的某只蚂蚁. ( 即把蚂蚁的碰头看作是对穿而过. 不会碰头 )

所以对于广泛一点的情况,

起始 : (1,R),(3,L),(8,L)

2秒后一定会有: (3,R), (1,L), (6,L).

到此我们可以发现, 其实前后两种情况的蚂蚁的相对位置没有变化, 即对前后两种情况按位置排完序之后, 对应的关系是一一对应的. 那么就比较好做了.

注意一点就是, 由于输入的顺序时任意的, 所以我们需要把之前的位置关系记下来. 并且处理下掉头的情况.

AC Code

/** @Cain*/
const int maxn=1e4+5;
int order[maxn];
int cas=1;
char *dirname[] = {"L","Turning","R"};
struct node
{
int pos,id,dir;  //-1代表左, 0 表示正在掉头, 1 表示右
bool operator < (const node& a) const {
return pos > a.pos;
}
}before[maxn],after[maxn];

void solve()
{
int L,T,n;
scanf("%d%d%d",&L,&T,&n);
for(int i=1;i<=n;i++){
int x; char s[10] = {0};
scanf("%d%s",&x,s);
int d = s[0] == 'L'?-1:1;
before[i] = (node){x,i,d};
after[i] = (node){x+T*d,0,d};   //编号不确定
}
sort(before+1,before+n+1);
sort(after+1,after+1+n);
for(int i=1;i<=n;i++){
order[before[i].id] = i ;
}
for(int i=1;i<n;i++){
if(after[i].pos == after[i+1].pos )
after[i].dir = after[i+1].dir = 0;
}
printf("Case #%d:\n", cas++);
for(int i=1;i<=n;i++){
int now = order[i];
if(after[now].pos < 0 || after[now].pos > L) printf("Fell off\n");
else printf("%d %s\n",after[now].pos,dirname[after[now].dir+1]);
}
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: