贝茜放慢脚步
奶牛贝茜正在参加冬季哞林匹克运动会的越野滑雪比赛。
她以每秒 1 米的速度出发。
但是,随着时间的推移,她变得越来越疲倦,她开始放慢脚步。
每次放慢脚步,贝茜的速度都会降低:减速一次后,她以每秒 1/2 米的速度移动,减速两次后,则以每秒 1/3 米的速度移动,依此类推。
你将被告知何时何地贝茜会减速。
当减速信息格式为:
T 17
意味着,贝茜在某个时间点减速,本例表示比赛开始第 17 秒贝茜减速。
当减速信息格式为:
D 10
意味着,贝茜在某个地点减速,本例表示在行进 10 米处减速。
给定 N 个减速信息,请计算贝茜滑完一千米需要多少秒。
将你的答案四舍五入到最接近的整数( 0.5 向上舍入为 1)。
输入格式
第一行包含整数 N。
接下来 N 行,每行描述一个减速信息,格式为 T x 或 D x。
无论哪种情况,x 都是一个整数,保证所有减速都在贝茜滑完一千米前发生。
可能同时发生多次减速,那么这会使得贝茜的速度一下子变慢很多。
所有减速信息不一定按顺序给出。
输出格式
输出贝茜滑完一千米所需的总时间。
数据范围
1≤N≤10000
输入样例:
2
T 30
D 10
输出样例:
2970
样例解释
贝茜以每秒 1 米的速度跑完前 10 米,耗时 10 秒。
然后她减速到每秒 1/2 米,接下来的 10 米要花 20 秒。
然后她在第 30 秒时,再次减速到每秒 1/3 米。
滑完剩下的 980 米需要 980×3=2940 秒。
因此,总时间是 10+20+2940=2970 秒。
分析:
我们要求总的时间,当我们在减速的时候,速度变成1/v,(v会不断变化增加),算路程的时间时除于速度相当乘于v,还有就是我们要判断谁先到达减速要求,我们通过时间大小来判断,小的自然是先处理。当一个走完时,我们只需要走另外一个就可以了,当两个所给的都走完,那么只需求出剩余路程算出时间相加即可,值得注意的是,当前所走的总路程:len是含有小数的,当前总时间t也是如此,故设为double类型。
附上代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int a[N], b[N], ap, bp;
int main() {
int n;cin >> n;
for (int i = 0; i < n; i++)
{
char x; int m;
cin >> x>>m;
if ('T' == x) a[ap++] = m;//存入减速时间
else b[bp++] = m;//存入减速路程
}
//排好序
sort(a, a + ap);
sort(b, b + bp);
double len=0, t=0 ;//len是总的长度,t是总的时间
int ai = 0, bi = 0, v = 1;//v是分母,因为分子都是一相除时自然为整数
while (ai < ap && bi < bp)
{
double t1 = a[ai] - t;
double t2 = (b[bi] - len) * v;
if (t1 == t2)
{//当两个时间相等时,都要减速
t = a[ai];
len = b[bi];
v += 2,ai++,bi++;
}
else if (t1 < t2) {
//先到达减速时间
len+=(a[ai] - t) / v;
t = a[ai];
v++, ai++;
}
else {
//先到达路程减速
t += (b[bi] - len) * v;
len = b[bi];
v++, bi++;
}
}
//当一个走完的情况,另一个没有走完
while (ai < ap)
{len += (a[ai] - t) / v;
t = a[ai];
v++, ai++;
}
while (bi < bp)
{
t += (b[bi] - len) * v;
len = b[bi];
v++, bi++;
}
//加上最后一段
cout << (int)(t + (1000 - len) * v + 0.5) << endl;
return 0;
}