题目大意
有 NNN 个小球在光滑水平的地上,初始速度有三种情况,−1,0,1-1, 0, 1−1,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;
}

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

被折叠的 条评论
为什么被折叠?



