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

来源:互联网 发布:手动 备份 hdfs 数据 编辑:程序博客网 时间:2024/06/01 09:44

传送门
//题意:给出一根长度为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");}
原创粉丝点击