题解 CF1501A 【Alexey and Train】
posted on 2021-03-13 21:57:02 | under 题解 | source
简单模拟题,考验选手的读题能力和使用谷歌翻译的能力。
先定义一个 \(now=0\),我们最后算出来的结果为 \(now\)。对于每个站(不包括第 \(n\) 站),我们需要加上 \(3\) 个部分:
- 额外时间,
now+=ex[i]
; - 第 \(i-1\) 站到第 \(i\) 站的时间,
now+=a[i]-b[i-1]
; - 在每一站待的时间,
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;
}
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/Solution-cf1501a.html