这一题特别想吐槽,一开始考虑错了,在纸上画不清楚,后来重新拿了草稿纸,确定划得对了,提交,60分!!!why!!后来注意到范围的问题,于是把变量统统改成了long long,却只把输出改成了ld,依然只有60分!!
再后来终于意识到long long的输出,也要lld,这才正确= =太辛酸了。。
考虑思路如下:
1、红绿灯会循环,先让linshi%(r+g+y),得到的数对应是如果走完了循环,那么现在还剩多少时间,再与tm比较,根据当前的红黄绿,再逐一讨论
2、讨论的时候,盯着诸如r-(smpol-tm)这样来算就不容易出错(真的比较容易糊涂= =),因为是倒计时,拿当前灯完整的时间-smpol在此区间已走的时间,才是要走的时间
AC代码:
#include <stdio.h>
#include <string.h>
int main(){
long long r,y,g;
long long n;
long long signal,tm;
long long linshi = 0;
long long sympol;
scanf("%lld %lld %lld",&r,&y,&g);
scanf("%lld",&n);
for(long long i = 0;i <n;i++){
scanf("%lld %lld",&signal,&tm);
if(signal == 0){ //直接走路
linshi = linshi + tm;
}
else if(signal == 1){ //红灯
sympol = (linshi)%(r+y+g);
if(sympol<tm){
linshi = linshi + tm - sympol; //仍然红灯,等待
}
else if(sympol>=tm && sympol<g+tm){
linshi = linshi + 0; //绿灯区间
}
else if(sympol>=g+tm && sympol< g+tm+y){
linshi = linshi + y-(sympol-g-tm)+r; //黄灯区间
}
else{
linshi = linshi + r-(sympol-g-y-tm); //红灯
}
}
else if(signal == 2){ //黄灯
sympol = (linshi)%(r+y+g);
if(sympol<tm){
linshi = linshi + tm - sympol +r;
}
else if(sympol>=tm && sympol<r+tm){
linshi = linshi + r-(sympol - tm);
}
else if(sympol>=r+tm && sympol< r+tm+g){
linshi = linshi + 0;
}
else{
linshi = linshi + y-(sympol-r-g-tm) + r;
}
}
else if(signal == 3){ //绿灯
sympol = (linshi)%(r+y+g);
if(sympol<tm){
linshi = linshi + 0;
}
else if(sympol>=tm && sympol<y+tm){
linshi = linshi + y-(sympol - tm) + r;
}
else if(sympol>=y+tm && sympol< r+tm+y){
linshi = linshi + r-(sympol-y-tm);
}
else{
linshi = linshi + 0;
}
}
}
printf("%lld",linshi);
}
/*
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
*/