CSP 201812-2 小明放学

  问题描述:


 

解题思路:

  1. 由于数据的量较大,需要使用long long来存储结果,否则会爆掉结果只能得到一部分的分
  2. 可以类比时钟,将红绿灯的变换当成时钟的运转,这样用模运算来断定红绿灯在到达时处于什么颜色
  3. 注意看前一题上学,我做的时候没看,导致以为黄灯能直接走,卡了很久

  代码实现:

 

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int n;
 6 int dur[3];
 7 int light;//当前是什么灯
 8 int cost;//这段路程要花多少时间
 9 int wait;
10 long long sum=0;//总时间
11 
12 void getwait(int l,int remain)
13 {
14     int j;
15     if(l==1)
16         j=0;
17     else if(l==2)
18         j=2;
19     else
20         j=1;
21     int arit = (sum+dur[j]-remain)%(dur[2]);//处于什么段
22     //判断是不是红灯
23     if(arit<dur[0])
24         wait = dur[0]-arit;
25     //是不是黄灯
26     else if(arit>=dur[1])
27         wait=dur[0]+dur[2]-arit;
28     else
29         wait = 0;
30 }
31 int main()
32 {
33     cin>>dur[0]>>dur[2]>>dur[1];
34     dur[1]+=dur[0];
35     dur[2]+=dur[1];
36     cin>>n;
37     while(n--)
38     {
39         cin>>light>>cost;
40         if(!light)//单纯的走一段路
41         {
42             sum+=cost;
43         }else{
44             getwait(light,cost);
45             sum+=wait;
46         }
47 
48     }
49     cout<<sum;
50     return 0;
51 }

总结:

  需要注意题中所给的条件

  观察数据的大小,判断是否会超出存储范围。

 

posted @ 2019-08-01 22:58  CrosseaLL  阅读(156)  评论(0编辑  收藏  举报