(算法练习)——201812-2小明放学(CCF模拟)

这一题特别想吐槽,一开始考虑错了,在纸上画不清楚,后来重新拿了草稿纸,确定划得对了,提交,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

*/
发布了212 篇原创文章 · 获赞 6 · 访问量 6404

猜你喜欢

转载自blog.csdn.net/weixin_42377217/article/details/104277119