CCF CSP 201803-2 碰撞的小球
阿新 • • 發佈:2020-09-08
因為每個球最終的相對位置的序號是不變的
而且碰撞可以看成穿過,所以直接可以計算所有的最終位置
和樹上的螞蟻這題很像
#include <bits/stdc++.h> using namespace std; int main(int argc, char** argv) { int n,L,t; cin>>n>>L>>t; vector<pair<int, int> > b(n); //用來定位第i個小球的位置 vector<int> a(n); // 結果位置的陣列 vector<int> ans(n); // 用來記錄第i個小球的相對位置是哪個 int sum = 0; for(int i=0; i<n; i++){ //輸入資料 cin>>a[i]; b[i]=make_pair(a[i],i); sum = (a[i]+t)/(L); // 求走了整個尺子幾次 int rem = (a[i]+t)%(L); // 沒有完整的走下來的剩餘的步數 if(sum&1) // 如果走過整個尺子是奇數次,那麼相當於剩下的是在從L往回走 a[i]=L-rem; else // 反之,就是在從0往L這個方向走 a[i]=rem; } sort(b.begin(), b.end()); // 這樣是為了按照起步位置排序,然後確定第i個點出發的相對是第幾號 sort(a.begin(), a.end()); // 最左起步的點還是最左的位置,所以最終位置要排序 for(int i=0; i<n; i++){ // ans[i] 表示的是第i個人是第幾個起步的 ans[b[i].second] = i; } for(int i=0; i<n; i++){ // a[i]存著第i個起步的人的最終位置, 所以a[ans[i]] 就是第i個人的最終位置 cout<<a[ans[i]]<<" "; } return 0; }