UVA-10881 Piotr's Ants

来源:互联网 发布:柯洁评论黑嘉嘉 知乎 编辑:程序博客网 时间:2024/06/02 05:27

     

这道题以前在那见过,但是当时没做出来,今天有看到这道题感觉真的听巧妙的,嘿嘿嘿,如果不看是哪只蚂蚁,忽略碰撞之后转身这个条件,其实在这两种情况下最后蚂蚁的位置都是相同的,而要解决的问题就是确定在哪一个位置上究竟是哪只蚂蚁,每只蚂蚁的相对顺序是不变的(因为相撞之后转身,不能穿过),所以顺序的问题就解决了,啊,ACM真的是有趣!!!

#include#include#include#includeusing namespace std;const int N = 10000 + 5;struct ant{    int id, p, d;    bool operator < (const ant & x) const {        return p < x.p;    }}before[N],after[N];int L, n, t, order[N];const char* dir[3] = {"L", "Turning", "R"};  //这也不得不说很巧妙!void Solve_question(){    static int Case = 0;    sort(before, before + n);    for(int i = 0; i < n; i++)        order[before[i].id] = i;            //记录顺序    sort(after, after + n);    for(int i = 0; i < n - 1; i++)        if(after[i].p == after[i + 1].p) after[i].d = after[i + 1].d = 0;    printf("Case #%d:\n",++Case);    for(int i = 0; i < n; i++){        int a = order[i];        if(after[a].p < 0 || after[a].p > L) printf("Fell off\n");        else printf("%d %s\n", after[a].p, dir[after[a].d+1]);    }    printf("\n");}void Input_data(){    int p, d;    char c;    scanf("%d %d %d", &L, &t, &n);    for(int i = 0; i < n; i++){        scanf("%d %c", &p, &c);        d = (c == 'L'? -1 : 1);            // -1表示向左运动, 0表示正在转身, 1表示向右运动        before[i] = (ant){i, p, d};        after[i] = (ant){0, p + t * d, d};    }}int main(){    int T;    scanf("%d", &T);    while(T--){        Input_data();        Solve_question();    }}

原创粉丝点击