问题描述
试题编号: | 201812-2 |
试题名称: | 小明放学 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | 题目背景 汉东省政法大学附属中学所在的光明区最近实施了名为“智慧光明”的智慧城市项目。具体到交通领域,通过“智慧光明”终端,可以看到光明区所有红绿灯此时此刻的状态。小明的学校也安装了“智慧光明”终端,小明想利用这个终端给出的信息,估算自己放学回到家的时间。 问题描述 一次放学的时候,小明已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。同时,小明通过学校里安装的“智慧光明”终端,看到了出发时刻路上经过的所有红绿灯的指示状态。请帮忙计算小明此次回家所需要的时间。 输入格式 输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。 输出格式 输出一个数字,表示此次小明放学回家所用的时间。 样例输入 30 3 30 样例输出 46 样例说明 小明先经过第一段路,用时 10 秒。第一盏红绿灯出发时是红灯,还剩 5 秒;小明到达路口时,这个红绿灯已经变为绿灯,不用等待直接通过。接下来经过第二段路,用时 11 秒。第二盏红绿灯出发时是黄灯,还剩两秒;小明到达路口时,这个红绿灯已经变为红灯,还剩 11 秒。接下来经过第三、第四段路,用时 9 秒。第三盏红绿灯出发时是绿灯,还剩 10 秒;小明到达路口时,这个红绿灯已经变为红灯,还剩两秒。接下来经过最后一段路,用时 3 秒。共计 10+11+11+9+2+3 = 46 秒。 评测用例规模与约定 有些测试点具有特殊的性质: |
注意区别上一题,还有就是把例子仔细研究一下。最后发现,现在的输入数据为 出发时 的红绿灯情况。由于上一题已经有大概思路,我打算将 当时的 时间 通过 与总时间取余后的判断 来同步 到当前的红绿灯情况和倒计时
其中进行分类讨论时博主由于懒,惯性的以为 三种灯,应该只有三种情况,没有考虑到最后可能过了应该小于循环的时间的时候,可能回到同一种红绿灯情况的时候,倒计时与初始表达式不同的情况(因为time仍然是小于循环的,依然是一个循环内应该考虑的)
具体分类思路如图,原谅博主的手残(
以开始是红灯为例,这里有4种情况,都在应该以一个循环(即r+y+g)内,要分别计算四种情况的当前的倒计时(其中,如果是绿色的话,你可以不算,直接t=0,因为绿灯不需要等,return 0,与t无关)
代码如下:
#include<bits/stdc++.h>
using namespace std;
void trans(int &k,int &t,int r,int y,int g,long long sum);
int f(int k,int r,int t){
if(k==3){
return 0;
}
if(k==2){
return t+r;
}
if(k==1){
return t;
}
}
int main(){
int r,y,g;//红黄绿
//r-g-y-r-g-y...
cin>>r>>y>>g;
int n;cin>>n;
vector<int>k(n);
vector<int>t(n);//表示等待黄灯数
long long sum=0;
for(int i=0;i<n;i++){
cin>>k[i]>>t[i];
if(k[i]==0){
sum+=t[i];
}
else{
trans(k[i],t[i],r,y,g,sum);
sum+=f(k[i],r,t[i]);
}
}
cout<<sum;
}
void trans(int &k,int &t,int r,int y,int g,long long sum){
int time=sum%(r+y+g);//表示周期时间
//红-绿-黄-红-绿-黄 1-3-2-1-3-2
//k= 1 2 3 红 黄 绿
if(k==1){
if(time<t){
t=t-time;
k=1;
}
else if(time>=t&&time-t<g){
t=g-time+t;
k=3;
}
else if(time-t>=g&&time-t-g<y){
t=y+g+t-time;
k=2;
}
else if(time-t-g>=y&&time<=t+g+y+r){
k=1;
t=t+g+y+r-time;
}
}
else if(k==2){
if(time<t){
t=t-time;
k=2;
}
else if(time>=t&&time-t<r){
t=r-time+t;
k=1;
}
else if(time-t>=r&&time-t-r<g){
t=g-time+t+r;
k=3;
}
else if(time-t-r>=g&&time<=t+g+y+r){
t=t+g+y+r-time;
k=2;
}
}
else if(k==3){
if(time<t){
t=t-time;
k=3;
}
else if(time>=t&&time-t<y){
t=y+t-time;
k=2;
}
else if(time-t>=y&&time-t-y<r){
t=r+y+t-time;
k=1;
}
else if(time-t-y>=r&&time<=t+g+y+r){
k=3;
t=t+g+y+r-time;
}
}
}
//100!!!!!!!!!
这里也提示大家,如果你觉得思路复杂,可以打开画图工具画个图哦。
如果有帮助,可以点个赞哦~