ccf 201803 02 (碰撞的小球)
作者:
Accepting
,
2020-06-04 00:06:40
,
所有人可见
,
阅读 549
鄙人不才,此中鄙陋甚多,望海涵!!!
碰撞的小球
法1::纯模拟,较为简单
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N];//记录每个小球坐标
bool st[N];//记录状态,即向左还是向右运动
int main()
{
int n,l,t;
cin>>n>>l>>t;
for(int i=1;i<=n;i++) cin>>a[i];
for(int c=1;c<=t;c++)//运动t秒
{
for(int i=1;i<=n;i++)//使每个小球发生初步运动
{
if(!st[i]) a[i]++;//这里还需要注意一下题目规定开始时小球不在原点或L处
else a[i]--;
if(a[i]==l) st[i]=true;
else if(a[i]==0) st[i]=false;//当小球位于0处时一定只能向右运动
}
for(int i=1;i<=n;i++)//判断每个小球是否发生碰撞
for(int j=i+1;j<=n;j++)
if(a[i]==a[j]) st[i]=!st[i],st[j]=!st[j];//碰撞的小球方向
}
for(int i=1;i<=n;i++) cout<< a[i] <<" ";
return 0;
}
法2 理解难度较大,非常适合用于发散思维,鬼才做法
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int N=110;
//当小球碰撞后,其实可以理解为每个小球互不影响,碰撞时互相穿过!
//但这里还有一个比较隐藏的性质,就是虽然我们把“每个小球理解为互不影响,碰撞时互相穿过!”
//但是实际上小球的相对位置其实是不会发生改变的,由于碰撞,之前在前的小球还是在前,在后的小球
//仍然在后!
int a[N]; //记录开始位置
int ans[N]; //记录结束位置
int tmp[N]; //通过让tmp数组排序,使得输入小球的初始位置和最终位置相对应
int main()
{
map<int,int> dic;
int n,L,t;
cin>>n>>L>>t;
for(int i=0;i<n;i++)
{
cin>>a[i];
tmp[i]=a[i];
int temp=a[i]+t;
temp=temp%(2*L);
if(temp>L) ans[i]=L-temp%L;
else ans[i]=temp;
}
sort(tmp,tmp+n);//对小球的开始位置进行排序
sort(ans,ans+n);//对小球的最后位置进行排序
for(int i=0;i<n;i++) dic[tmp[i]]=i;
for(int i=0;i<n;i++) cout<<ans[dic[a[i]]]<<" ";
return 0;
}
持续更新中。。。。