题解:进行模拟,可以写一个结构体,装个该点的坐标和输入序号,首先按坐标排个序,开头和结尾特判一下,中间相邻的只要模拟一秒后相等也就是把方向跳转一下,最后再按照输入序号排序,输出答案。
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=150;
struct node{
int coor,no,b;
};
node a[maxn];
bool cmp1(node a,node b)
{
return a.coor<b.coor;
}
bool cmp2(node a,node b)
{
return a.no<b.no;
}
int main()
{
int n,t,l;
scanf("%d%d%d",&n,&l,&t);
for(int i=0;i<n;i++){
scanf("%d",&a[i].coor);
a[i].no=i;
a[i].b=1;
}
sort(a,a+n,cmp1);
for(int i=0;i<t;i++){
a[0].coor=a[0].coor+a[0].b;
if(a[0].coor==0){
a[0].b*=-1;
}
for(int j=1;j<n;j++){
a[j].coor=a[j].coor+a[j].b;
if(a[j].coor==a[j-1].coor){
a[j].b*=-1;
a[j-1].b*=-1;
}
}
if(a[n-1].coor==l){
a[n-1].b*=-1;
}
}
sort(a,a+n,cmp2);
for(int i=0;i<n;i++){
if(i!=0){
printf(" ");
}
printf("%d",a[i].coor);
}
printf("\n");
return 0;
}