1530: 小L玩滚球游戏
时间限制: 1 Sec 内存限制: 128 MB
提交: 32 解决: 9
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
小L正在玩滚球游戏,有n个水晶球在轨道上以不同开始位置和速度从近往远的方向滚动,如果两个水晶球在滚动过程中相遇,它们就会融合成一个水晶球,然后以速度较慢的水晶球的速度继续向前滚动, 问经过时间t后,轨道上还有多少水晶球。
输入
第一行输入两个整数n、t,n代表水晶球的数量(1 <= n <= 105, 0<t<231),t代表时间。
接下来n行,每行两个整数,按位置从近到远的顺序给出水晶球的初始位置和速度。
输出
输出一个整数表示经过时间t后水晶球的数量。
样例输入 Copy
5 3 0 1 1 2 2 3 3 2 6 1
样例输出 Copy
3
从后往前以此判断当前球能否被前一个球追上,如果可以追上,则更新前一个球的dis值为当前球的dis值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
struct node
{
ll x,v;
}a[maxn];
ll dis[maxn]; //存放每个球在t时间内所能到达的最远距离
int n;ll t;
int main()
{
scanf("%d%lld",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&a[i].x,&a[i].v);
dis[i]=a[i].x+a[i].v*t; //记录dis数组
}
int ans=n; //初始ans为n个球
for(int i=n;i>=2;i--) //从后往前遍历,因为初始位置大的在后面,这样贪心保证最优
if(dis[i-1]>=dis[i]) ans--,dis[i-1]=dis[i]; //如果当前球大与等于前一个球的最远距离 则更新前一个球的dis为当前球的dis ,且ans--
cout<<ans<<endl;
}