csp 小明放学解析

    科技2024-07-08  72

    题解

    相信大家已经看过题了,直接上思路!!

    信号灯的顺序是绿->黄->红,和输入的顺序是相反的。

    就按照题目给的例子来说,输入为3 10时,之前用时为41s,那么41-10=31,也就是该绿灯走完后,还有31s。那么这31s内,该绿灯变成了什么颜色? 31-3=28,走完黄灯。28-30= -2,可见没有走完红灯,那么此时就要等待2s。

    对于其余样例,大家可以试试,说白了也就是一个简单的模拟!

     

    注意点

    1.根据该题的 评测用例规模与约定 ,数据应该为long long型。 2.代码中: temp=sum%total-arr[i][1]; ,如果不对sum取余,会超时。total为绿黄红的一个周期,对于完整的周期就不用考虑了,这样可以节省时间!只需要考虑取余后最后落到了那个时间里。

     

    C++代码

    #include <iostream> #include <math.h> using namespace std; int main(int argc, char** argv) { long long light[3]; //存放红黄绿灯时间 for(int i=0;i<3;i++){ cin>>light[i]; } long long total=light[0]+light[1]+light[2];//一个周期 long long n; cin>>n; long long arr[n][2];//输入二维数组 for(int i=0;i<n;i++){ for(int j=0;j<2;j++){ cin>>arr[i][j]; } } long long sum=0,temp; int index; for(int i=0;i<n;i++){ if(arr[i][0]==0){//标志为0,那么直接加入总时间中 sum+=arr[i][1]; continue; } temp=sum%total-arr[i][1]; index=arr[i][0]-1;//index表示该减去light中那个元素 while(temp>0){ index--; if(index==-1)index=2; temp=temp-light[index]; } if(index==0){//落在红灯中,下一个是绿灯,所以直接加上等待红灯时间即可 sum+=abs(temp); }else if(index==1){//落在黄灯中,还要等红灯,所以加上等待红和黄的时间 sum+=abs(temp)+light[0]; } } cout<<sum; return 0; }

     

    Processed: 0.014, SQL: 8