CCF201803-2--碰撞的小球

本文介绍了一种解决小球碰撞问题的方法,通过将碰撞后的小球视为独立运动,并使用排序和枚举来确定每个小球最终的位置。代码实现采用C++语言,展示了结构体定义、比较函数、数组操作等技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
这里写图片描述
这里写图片描述

**解题思路:
首先简化问题,当小球碰撞之后,a,b两个小球会反向行驶,这时你可以把a看作是b,把b看作是a,这样就可以忽略掉碰撞,把每一个小球是独立的行驶,单独算出每一个小球的最终停下的位置,然后排序,按照输入数据的大小排序输出停下的位置**

#include<cstdio>
#include<iostream>
#include<algorithm> 

using namespace std;
struct edge{
    int id;
    int place;
};
bool comp(const edge& e1,const edge& e2){
    return e1.place<e2.place;
}
edge a[102];
int main(){
    int n,L,t;
    int b[102];
    cin>>n>>L>>t;
    for(int i=0;i<n;i++){
        a[i].id=i;
        cin>>a[i].place;
        b[i]=a[i].place;
    } 
    sort(a,a+n,comp);
    for(int i=0;i<n;i++){
        b[i]=(b[i]+t)%(2*L);
        if(b[i]>L) b[i]=2*L-b[i];
    }
    sort(b,b+n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(a[j].id==i){
                cout<<b[j]<<" ";
                break;
            }
        }
    }
    cout<<endl;
    return 0;
}

最后的搜索可以使用二分搜索,但因为此题n<100,所有枚举搜索不影响;

转载请标明出处:附上该文章链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值