Piotr's Ants UVA - 10881

vj传送门

uva传送门

 

题意 给你一根木棒长度, 然后n个蚂蚁的初始位置和 初始方向,  问 t 时间以后蚂蚁的位置和方向是?(蚂蚁速度为 1 )

   这个题目的关键是两个蚂蚁相撞以后就互相反向运行  可以当成是两个小车相撞以后反向速度不变继续行驶,因为把蚂蚁缩小缩小缩小以后 宏观上看 相撞以后反向可以想象成直接穿过而行, 因为撞之前有一个从左向右行驶的小车和一个从右向左行驶的小车 速度都为1 , 撞之后依然是两个这样的小车 只不过小车方向互换了而已  之前向右 撞完以后向左了 之前向左的向右了, 可以暂时忽略这个方向问题 只需要记住撞之前有一个小车从位置1 跑向右边, 那么1s  位置2以后一定有一辆小车,

  然后我们还可以观察到一个性质就是 无论怎么撞  小车与小车的相对位置不变, 比如说 小车1从左向右开 小车2从右往左开 无论他们怎么撞 小车1还是在小车2的左边  小车2还是在小车1的右边, 因为他们撞完以后只能改变开的方向 不能真正的穿过去

 所以这道题我们只需要记录一下蚂蚁的初始位置的从左到右的顺序, 然后每个蚂蚁直接跑 t 时间, 再排个序 根据初始位置输出即可, 还需要判断一下有没有在同一位置的蚂蚁(正在相撞) 或者有没有掉下木棒啥的

 哦, 输出每个样例还得换行 PE警告

#include<bits/stdc++.h>

using namespace std;
#define ll long long
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)
#define all(v) (v).begin(), (v).end()

struct Ant {
    int pos, dir, idx;
    bool operator < (const Ant& x) {
        return x.pos < pos;
    }
};
void task10881() {
    int t1; cin >> t1;
    int kase = 1;
    while(t1--) {
        cout << "Case #" << kase++ << ":\n";
        int l, t, n; cin >> l >> t >> n;
        vector<Ant> a(n), b(n);
        _for(i,0,n) {
            string s;  
            int x;
            cin >> x >> s;
            int d = (s=="R" ? 1 : -1);
            a[i] = (Ant){x,d,i};
            b[i] = (Ant){x+d*t,d,0};
        }
        sort(all(a));
        sort(all(b));
        vector<int> order(n);
        _for(i,0,n) order[a[i].idx] = i;
        _for(i,1,n) if(b[i].pos == b[i-1].pos) b[i-1].dir = b[i].dir = 0;
        string s[] = {"L", "Turning", "R"};
        _for(i,0,n) {
            int x = order[i];
            if((b[x].pos < 0) or (b[x].pos > l)) cout << "Fell off\n";
            else cout << b[x].pos << " " << s[b[x].dir+1] << "\n";
        }cout << "\n";
    }
    return;
}

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    task10881();
    //task3();
    return 0;
}

 

posted @ 2020-08-16 22:30  163467  阅读(88)  评论(0编辑  收藏  举报