CCF 201812-2 小明放学 C++ 注意挺难

在这里插入图片描述
在这里插入图片描述
//与上一题不同的是,k=1、2、3 时,分别表示出发时刻,所以要考虑到走完这段路程的时候灯的颜色是否已经变了
//红绿黄循环。用sum记录前面路程用的总时间,circle记录红黄绿一轮的时间。是红灯时,判断t和sum的大小,如果t>sum说明红灯还没完,t-sum是剩余要等待的红灯时间;若t<sum说明红灯已经结束,sum-t是超出的时间,考虑到可能过去了不止一轮先求余,int temp=(sum-t)%circle,再判断temp是否超出了绿灯时间g,如果超出则又到黄灯,再判断是否超出黄灯超出则又到红灯。对于黄灯和绿灯的判断也类似。
满分代码:

#include <iostream>
using namespace std;
int main()
{
	int r,y,g,n,k,t;
	long long sum=0;
	cin >> r >> y >> g >> n;
	int circle=r+y+g;
	for(int i=0;i<n;i++)
	{
		cin >> k >> t;
		if(k==0)   sum+=t;
		else if(k==1)   
		{
			if(t>=sum) sum=t;//其实只有在第一次遇到灯时有可能出现这种情况 
			else 
			{
				int temp=(sum-t)%circle;
				if(temp>=g&&temp<=g+y)  sum+=y+g-temp+r;
				else if(temp>g+y) sum+=circle-temp; 
			}
		}
		else if(k==2)
		{
			if(t>=sum) sum=t+r;
			else
			{
				int temp=(sum-t)%circle;
				if(temp<r) sum+=r-temp;
				else if(temp>=g+r&&temp<=g+y+r) sum+=circle-temp+r;
			}
		}
		else if(k==3)
		{
			if(t<sum)
			{
				int temp=(sum-t)%circle;
				if(temp<=y) sum+=y-temp+r;
				else if(temp>y&&temp<y+r)  sum+=r+y-temp;
			}
		}
	}
	cout << sum << endl;
	return 0;
}


注意:long long sum=0;一定要初始化,否则会导致80分。
一定要long long,否则60分。
其实t>sum的几率很小很小。
该题的精髓在于怎么处理循环取余

int temp=(sum-t)%circle;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值