题解 CF1501A 【Alexey and Train】

发布时间 2023-07-25 12:36:11作者: caijianhong

posted on 2021-03-13 21:57:02 | under 题解 | source

简单模拟题,考验选手的读题能力和使用谷歌翻译的能力

先定义一个 \(now=0\),我们最后算出来的结果为 \(now\)。对于每个站(不包括第 \(n\)),我们需要加上 \(3\) 个部分:

  1. 额外时间,now+=ex[i]
  2. \(i-1\) 站到第 \(i\) 站的时间,now+=a[i]-b[i-1]
  3. 在每一站待的时间,now+=ceil(b[i]-a[i],2),注意为了防止精度误差我们选择手写ceil
int ceil(int a,int b){
	return a/b+(a%b!=0);
}

只有这些是不够的。还需要加一个特判,如果加完上面这些东西火车还没出发,要一直等到火车出发才能去下一站,if(now<b[i]) now=b[i]

最后,我们还要算上最后一站的时间,now+=ex[n],now+=a[n]-b[n-1]

代码:

#include <cstdio>
using namespace std;
int a[110],b[110],ex[110],n;
int ceil(int a,int b){
    return a/b+(a%b!=0);
}
int mian(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",a+i,b+i);
    for(int i=1;i<=n;i++) scanf("%d",ex+i);
    long long now=0;//保险起见开个ll
    for(int i=1;i<=n-1;i++){
        now+=ex[i];
        now+=a[i]-b[i-1];
        now+=ceil(b[i]-a[i],2);
        if(now<b[i]) now=b[i];
    }
    printf("%lld\n",now+ex[n]+a[n]-b[n-1]);
    return 0;
}
int main(int T,char**){
    for(scanf("%d",&T);T--;mian());
    return 0;
}