CCF201803-2--碰撞的小球

377 阅读1分钟

这里写图片描述 这里写图片描述 这里写图片描述

解题思路: 首先简化问题,当小球碰撞之后,a,b两个小球会反向行驶,这时你可以把a看作是b,把b看作是a,这样就可以忽略掉碰撞,把每一个小球是独立的行驶,单独算出每一个小球的最终停下的位置,然后排序,按照输入数据的大小排序输出停下的位置

#include<cstdio>
#include<iostream>
#include<algorithm> 

using namespace std;
struct edge{
	int id;
	int place;
};
bool comp(const edge& e1,const edge& e2){
	return e1.place<e2.place;
}
edge a[102];
int main(){
	int n,L,t;
	int b[102];
	cin>>n>>L>>t;
	for(int i=0;i<n;i++){
		a[i].id=i;
		cin>>a[i].place;
		b[i]=a[i].place;
	} 
	sort(a,a+n,comp);
	for(int i=0;i<n;i++){
		b[i]=(b[i]+t)%(2*L);
		if(b[i]>L) b[i]=2*L-b[i];
	}
	sort(b,b+n);
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(a[j].id==i){
				cout<<b[j]<<" ";
				break;
			}
		}
	}
	cout<<endl;
	return 0;
}

最后的搜索可以使用二分搜索,但因为此题n<100,所有枚举搜索不影响;

转载请标明出处:附上该文章链接