F. chino with ball

该博客介绍了一道编程题目,涉及小球在光滑水平面上的运动,初始速度为-1, 0, 1。题目要求计算经过kkk秒后每个小球的位置。解决方案中提到,可以通过排序小球的初始位置和假设碰撞后的位置来解决,最后根据初始序号恢复每个小球的实际位置并输出。代码实现中使用了C++,包括排序和遍历来确定每个小球的新位置。

题目大意

NNN 个小球在光滑水平的地上,初始速度有三种情况,−1,0,1-1, 0, 11,0,1

kkk 秒后各个小球的位置


题解

可以把小球碰撞后当作是穿过去了,这样编号就乱了,用起始的位置来维护一下。


代码

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define ff first
#define ss second

using namespace std;
const int N = 1e6;
int a[N], b[N];
pair<int, int> p[N];

void solve()
{
    ll n,k;
    cin >> n >> k;
    rep(i,1,n){
        int v;  // 速度
        cin >> p[i].ff >> v; 
        p[i].ss = i; // 小球开始的序号
        b[i] = p[i].ff + v * k; // 假设穿过,k秒后的坐标 
    }
    sort(b + 1, b + 1 + n); 
    sort(p + 1, p + 1 + n); // 以ff(开始位置)来排序
    rep(i,1,n)
        a[p[i].ss] = b[i];                   
    rep(i,1,n-1) cout << a[i] << ' ';
    cout << a[n];
}
int main(){
        solve();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值