201803-2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#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啦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值