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;
}
原文地址:https://www.cnblogs.com/Crossea/p/13634948.html