。。。为什么50分。。啊暂时不想改了 换别人的思路吧
#include<bits/stdc++.h> using namespace std; int r,y,g; int n; int change1(int sign,int number){ if(sign==1){ return number; }else if(sign==2){ return number+r; }else{ return 0; } } //红绿灯颜色变化是 红绿黄 但是sign按顺序是红黄绿!!!!!!!!!!!!! int change2(long long sum,int sign,int number){//参数类型 int remain = 0; if(sign==1){//原本是红灯 if(number+g > sum){ //过来的时候 在本轮绿灯 sum = sum; return sum; }else if(number+y+g>sum){//过来的时候 在本轮黄灯 sum += y-(sum-number-g); return sum; }else{//时间超出较多 已过本轮红绿黄 remain = sum-number-y-g; } }else if(sign==3){//原本是绿灯 if(number+y>sum){//过来的时候 在本轮黄灯 sum += y-(sum-number); return sum; }else{//时间超出较多 已过本轮绿黄 remain = sum-number-y; } }else{//原本是黄灯 remain = sum - number; } //其他轮开始 int complete = r+g+y; int still = remain%complete; if(still>=0 && still<r){//红 sum += (r-still); }else if(still>=r && still<r+g){//绿 sum = sum; }else if(still>=r+g && still<r+g+y){//黄 sum += (y-(still-r-g))+r; } return sum; } int main(){ cin>>r>>y>>g; cin>>n; int data[n][2]; long long sum = 0; for(int i=0;i<n;i++){ cin>>data[i][0]>>data[i][1]; } // for(int i=0;i<n;i++){ if(data[i][0]==0){ sum += data[i][1]; }else{ if(sum < data[i][1]){ sum += change1(data[i][0],data[i][1]); }else{ //换灯 sum = change2(sum,data[i][0],data[i][1]); } } } cout<<sum<<endl; return 0; } //https://blog.csdn.net/happywlg123/article/details/87864575 //其实是和我不太一样的思路 他是不分本轮还是其他论 到了路口直接取模运算 认为从到了路口那个节点开始算起再到那个节点 算一圈 //我的是从红灯开始的那一秒 算一个轮回 所以我的要分的情况更多一些 //50啊到底哪里错了 sum要用long long类型的传参的时候也是这样
原文:https://www.cnblogs.com/yundong333/p/13650899.html