贝茜放慢脚步

贝茜放慢脚步

奶牛贝茜正在参加冬季哞林匹克运动会的越野滑雪比赛。
她以每秒 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;
}

运行结果:

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjg_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值