问题分析:做一个红绿黄时间轴,题目给出的t是倒计时显示牌上显示的数字,先求出出发时t在时间轴上的时间,然后计算出time时间后红绿黄灯的状态,返回需要的时间。
代码如下
#include<cstdio>
using namespace std;
typedef long long ll;
ll r, g, y;
ll Ans(ll k, ll t, ll time)
{
if(k == 0) return t;
//求出t在红绿黄时间轴上的时间
if(k == 1)//如果出发时刻是红灯
t = r - t;
else if(k == 2)//如果出发时刻是黄灯
t = r + g + y - t;
else//如果出发时刻是绿灯
t = r + g - t;
t = (t + time) % (r + g + y);
if(t >= 0 && t < r)//如果经过time时间后是红灯
return r - t;
else if(t >= r && t < r + g)//如果经过time时间后是绿灯
return 0;
else if(t >= r + g && t < r + g + y) //如果经过time时间后是黄灯
return r + g + y - t + r;
}
int main()
{
scanf("%lld%lld%lld", &r, &y, &g);
int n;
ll ans = 0, k, t;
scanf("%d", &n);
while(n --)
{
scanf("%lld%lld", &k, &t);
ans += Ans(k, t, ans);
}
printf("%lld\n", ans);
return 0;
}
#include <iostream>
using namespace std;
typedef long long LL;
int r, y, g;
int time(int k, int t, LL ans, int sum)//计算小明走到该路口时红绿灯的状态
{
int time;
if(k == 1){ //出发时为红灯
time = (r - t + ans) % sum;
}else if(k == 2){//出发时为黄灯
time = (sum - t + ans) % sum;
}else{//出发时为绿灯
time = (r + g - t + ans) % sum;
}
if(time >= 0 && time <= r) return (r - time);
if(time > r && time <= r + g) return 0;
if(time > r+g && time <= sum) return (sum - time + r);
}
int main()
{
int n, sum, k;
LL ans = 0, t;
cin >> r >> y >> g >> n;
sum = r + g + y;
while(n --)
//分析:n最大为1e5,t最大为1e6,设想一种极端情况(✪ω✪):n和t都取到最大范围,n个t相加范围相当于1e11,超出了int的范围,所以ans需要写成long long类型,为保持精度一致,time()函数返回值类型也为long long类型!
{
cin >> k >> t;
if(k == 0){
ans += t; //此处可能会爆int,要用long long类型
}else{
ans += time(k, t, ans, sum);
}
}
cout << ans << endl;
return 0;
}