1. 程式人生 > 實用技巧 >CCF-小明放學

CCF-小明放學

。。。為什麼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型別的傳參的時候也是這樣