CCF 201803-2 碰撞的小球

原文链接

我的个人博客

原题链接

碰撞的小球

思路

该题灵感来自于蓝桥杯的蚂蚁感冒这个题目。感兴趣的可以去搜索一下。
  第一:无论经过多长时间,小球的相对位置不会发生改变的。因此他们每次发生碰撞都会改变方向,因此每两个球在坐标轴上的相对位置是不会发生变化的。
  第二:两个小球相撞,每个球都改变了方向,可以看作他们互相穿过了对方
这样一来我们就可以把复杂的相撞改变方向,简化为不改变方向运动了t秒。
这一段是算t秒之后,所在的位置

		int cur = (tmp+t)%(2*L);
		if(cur > L){
			cur = L - cur%L;
		}

  最后我们会得到一系列小球的位置。在v_end中存放。因为无论发生多少次碰撞,无论经过多长时间,球的相对位置是不会发生改变的。所以,可以讲初始位置和最后位置进行排序,然后就可以实现两两匹配了。
  最后按原来的小球顺序,输出最后的结果。

代码
#include <bits/stdc++.h>
using namespace std;
int n,L,t,tmp;
map<int,int>pos;//记录最后的位置 

int main(){
	cin>>n>>L>>t;
	vector<int> v_first,v_end;//初始的位置 
	for(int i=0;i<n;i++){
		cin>>tmp;
		v_first.push_back(tmp); 
		int cur = (tmp+t)%(2*L);
		if(cur > L){
			cur = L - cur%L;
		} 
		v_end.push_back(cur);
	}
	vector<int> v(v_first.begin(),v_first.end());//保留原来的顺序信息 
	sort(v_first.begin(),v_first.end());
	sort(v_end.begin(),v_end.end());//小球的最后位置 
	for(int i=0;i<n;i++){
		pos[v_first[i]] = v_end[i];//绑定最后的位置 
	}
	for(int i=0;i<n;i++){ //按原来顺序输出最后的小球顺序 
		cout<<pos[v[i]]<<" "; 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值