CCF201812-2小明放学

题目描述

小明放学

思路

是第一题小明上学的升级版
注意这里的数据类型都要使用long long!
对于每一个输入(k,t)是相对于出发时的时刻而言的,因此我们需要根据现在已经过去的时间,推算出现在还需要等待多长时间。这里我用getTime这个函数来计算。
我们利用一个[0,r+g+y]的数轴来辅助计算
第一步:计算出发时刻,在数轴上的位置
第二步:计算times时间之后,在数轴上的位置
第三步:计算改时间下,需要等待的时间
在这里插入图片描述
如第四条记录。k为2,t为2,表示此时处于黄灯,且还有2秒黄灯结束。
1、0时刻在数轴上的位置为,(30+3+30-2),也就是61
2、当到达该红绿灯时,时间已经过去了21秒。那么现在在数轴上的位置就是(61+21)%(30+3+30),也就是19
3、计算19秒处到绿灯的距离,也就是30-19=11。

代码
#include <bits/stdc++.h>
using namespace std;
long long r,y,g,n,ans,k,t;
long long getTime(int k,int t,long long times){
	long long cur;//当前的时间 
	if(k == 1){//红灯 
		cur = r - t; 
	}else if(k == 3){//绿灯 
		cur = r+g - t;
	}else if(k == 2){//黄灯 
		cur = r+g+y -t;
	}
	cur = (cur+times)%(r+y+g);
	if(cur <= r){//在红灯位置 
		cur = r-cur;//返回需要的等待时间 
	}else if(cur <= r+g){//在路灯位置,无需等待 
		cur= 0;
	}else if(cur <= r+g+y){
		cur = r+g+y-cur+r;//黄灯结束的时间+红灯时间 
	} 
	return cur;
}
int main() {
	cin>>r>>y>>g>>n;
	for(int i=0;i<n;i++){
		cin>>k>>t;
		if(k == 0){
			ans += t;//路段 
		}else{
			ans += getTime(k,t,ans);
		} 
	}
	cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值