题意 给你一根木棒长度, 然后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++ << ": "; 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 "; else cout << b[x].pos << " " << s[b[x].dir+1] << " "; }cout << " "; } return; } int main() { ios::sync_with_stdio(false), cin.tie(nullptr); task10881(); //task3(); return 0; }