小明放学


from CCF-CSP 2018-12-2
Time limit:1s
Memory limit:512MB

小明放学_ios


题目简单,但是要注意int会溢出,106*105=1011了,我最开始没注意数据范围被卡了好久

ac代码:
#include<iostream>
using namespace std;
int r,y,g,n,k,t,all; //如题(all表示三种灯一轮一共需要多长时间,即all=r+y+g)
long long sum; //总时间,注意溢出,需要用long long
void solve(){ //处理每一组k和t
cin>>k>>t;
int s;
switch (k){
case 0: //道路
sum += t;break;
case 1: //红灯
if(sum < t){ //如果到达这个路口的总时间比这个灯的时间少,那么就到了过后再等完红灯就行了
sum += (t - sum);break;
}
s = (sum - t) % all;
if(s <= g) break; //绿灯直接走
else sum += (all - s);//其他灯则继续登下一个绿灯
break;
case 2:
if(sum < t + r){ //同上,只是在黄灯过后要多一个红灯
sum += (t + r - sum);break;
}
s = (sum - t - r) % all;
if(s <= g) break; //同上
else sum += (all - s);
break;
case 3:
if(sum < t){
break;
}
s = (sum - t - r - y + all) % all;
if(s <= g) break;
else sum += (all - s);
break;
}
}
int main(){
cin>>r>>y>>g>>n;
all = r + y + g;
while(n--)
solve();
cout<<sum;
return 0;
}