碰撞的小球(ccf)

传送门

题解:进行模拟,可以写一个结构体,装个该点的坐标和输入序号,首先按坐标排个序,开头和结尾特判一下,中间相邻的只要模拟一秒后相等也就是把方向跳转一下,最后再按照输入序号排序,输出答案。

附上代码:


#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;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/81778690