1. 程式人生 > 實用技巧 >Piotr's Ants UVA - 10881

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; }