【寒假每日一题2022】acw1934. 贝茜放慢脚步【二路归并】

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

思路:每次取时间靠前的那一项拓展,另一项伴随拓展。(原来这就叫二路归并…
代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010;
typedef long long LL;
LL a[N],b[N],n,cnt1,cnt2;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char c;LL x;cin>>c>>x;
        if(c=='T') a[++cnt1]=x;
        else b[++cnt2]=x;
    }
    sort(a+1,a+1+cnt1);sort(b+1,b+1+cnt2);
    LL l=1,r=1,v=1;
    double jl=0,sj=0;
    while(l<=cnt1&&r<=cnt2)
    {
        double t2=(b[r]-jl)*v;
        double t1=a[l]-sj;
        if(t1==t2) {sj=a[l];jl=b[r];v+=2;l++;r++;}
        else if(t1<t2) {jl+=(a[l]-sj)/v;sj=a[l];v++;l++;}
        else {sj+=(b[r]-jl)*v;jl=b[r];v++;r++;}
    }
    while(l<=cnt1) {jl+=(a[l]-sj)/v;sj=a[l];v++;l++;}
    while(r<=cnt2) {sj+=(b[r]-jl)*v;jl=b[r];v++;r++;}
    cout<<(LL)(sj+(1000-jl)*v+0.5);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值