#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct info
{
int index;
int way;
int lacation;
};
bool compare1(info a,info b)
{
if(a.lacation!=b.lacation)
{
return a.lacation<b.lacation;//返回一个按离原点的距离从小到大排序的数组
}
}
bool compare2(info a,info b)
{
if(a.index!=b.index)
{
return a.index<b.index;//返回一个index从小到大排序的数组,就是把数组再还原成一开始输入进去的数据。
}
}
int main()
{
int n,l,t;
cin>>n>>l>>t;
info a[n];
int local;
for(int i=0;i<n;i++)
{
cin>>local;
a[i].index=i;//在结构体里标记好该数字的顺序
a[i].lacation=local;
a[i].way=1;//往左走用-1表示 往右走用1表示
}
sort(a,a+n,compare1);
int time1=l-a[n-1].lacation;//先用离端点最近对的点去做一次比较,看他离她还有多远,把距离算出来,然后把数组整体往右边挪这个距离
a[n-1].way=-1;//由于最后一个点挪了之后就到达端点了,所以最后一个点的方向需要改变
for(int i=0;i<n;i++)//整体往后挪
{
a[i].lacation+=time1;
}
for(int i=time1+1;i<=t;i++)//从挪之后的时间 再到结束的时间 这段时间的移动情况进行循环,速度是1 m/s
{
for(int k=0;k<n;k++)
{
if(a[k].way==1){a[k].lacation+=1;}
else{a[k].lacation-=1;}
}
for(int p=0;p<n-1;p++)
{
if(a[p].lacation==a[p+1].lacation)
{
a[p].way=-(a[p].way);
a[p+1].way=-(a[p+1].way);
}
//到达0 和l两个端点对的时候 ,方向都要改变
if(a[p].lacation==l)
{
a[p].way=-(a[p].way);
}
if(a[p].lacation==0)
{
a[p].way=-(a[p].way);
}
}
if(a[n-1].lacation==l){a[n-1].way=-(a[n-1].way);}
}
sort(a,a+n,compare2);
for(int i=0;i<n;i++)
{
cout<<a[i].lacation<<" ";
}
return 0;
}
关键点:
1.使用一个结构体,定义把小球下一秒运动的方向way确定了 ,把小球在坐标点的距离存下来,然后就是把小球从输入端输入的顺序记录下来。
2.先给输入的小球按location的距离从小到大排一个序,先把离端点最近的那个电到右端点的距离time(因为1/m,所以时间就是距离)算出来,让大家都往右边移time个单位!!!别忘了最右边那个端点way就要变成原来的相反数。
3.确定装头条件:①到达左端点或者有端点,则自己方向变 ②相邻的连个点在同一个location上,则这两个点方向都变
4.最后再按输入进去的顺序还原回来就ok啦!