1. 程式人生 > 實用技巧 >CCF CSP 201803-2 碰撞的小球

CCF CSP 201803-2 碰撞的小球


因為每個球最終的相對位置的序號是不變的
而且碰撞可以看成穿過,所以直接可以計算所有的最終位置
和樹上的螞蟻這題很像


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