hdu 4505 小Q系列故事——电梯里的爱情 解题报告

   题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4505

   思路:开门次数的时间是跟要去的楼层数中总共有多少个不同的数有关;  每下一人的总时间跟

乘坐电梯的总人数有关;  最后问题出现了,向上运行或向下运行的时间我是根据:由于电梯最开始在0层,那么第一个人要去的楼层肯定是上去的,所以是 第一个人要去的楼层 × 6,中间那些人,就要判断是向上还是向下才能得出结果,最后一个人去完要去的楼层后,势必要回到0层,所以最后的时间还要加上  最后那个人要去的楼层 × 4。  

    wa代码

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int a[20], i, j, k, c, n, time;
 7     while (cin >> c)
 8     {
 9         while (c--)
10         {
11             scanf("%d", &n);
12             time = n;
13             for (i = 0; i < n; i++)
14                 scanf("%d", &a[i]);    
15             for (i = 0; i < n; i++)
16             {
17                 for (j = i+1; j < n; j++)
18                 {
19                     if (a[i] == a[j])     //在数组里删掉相同的数,剩下来的n表示总共要开多少次门
20                     {
21                         for (k = j; k < n-1; k++)
22                             a[k] = a[k+1];
23                         n--;
24                         j--;      //必须的,因为有可能删除之后,下一个数又跟a[i]相同
25                     }    
26                 }
27             }
28             time += n * 5;
29             time += a[0] * 6;      //从这里开始就是问题代码了
30 for (i = 0; i < n-1; i++) 31 { 32 if (a[i+1] > a[i]) 33 time += (a[i+1] - a[i]) * 6; 34 else 35 time += (a[i] - a[i+1]) * 4; 36 } 37 time += (a[n-1] * 4);
38 printf("%d\n", time); 39 } 40 } 41 return 0; 42 }

   一开始以为没有处理:如果那些人要去0层的话,那么时间应该是0,可是结果是6,所以加了一个特判,还是wa。(其实是不用的吧,因为题目说了都是正整数,0不是正整数)。看了discuss后,原来直接算出楼层最大值再乘以10即可,因为电梯最高能到达楼层最大值,接着要从楼层最大值下来,不管中间如何兜转,最终乘以10即可以算出向上运行或向下运行的总时间。

   终于知道为什么会wa了,万分感激“纯快乐”这位大神,不厌其烦地指出了我的错误。举个例子吧,比如说:5    4   2  5   3   6,从0——> 4层的时候,要先把去第2层的和去第3层的人放了,然后电梯再上去第5层,接着第6层,最后从第6层直接下到第0层。wa的代码里会有重叠的部分!!!wa的运行结果是130,而ac的运行结果是90。总的来说,电梯不会走回头路!!!

   ac代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int a[20], i, j, c, n, time, count;
 8     while (cin >> c)
 9     {
10         while (c--)
11         {
12             scanf("%d", &n);
13             time = n;
14             for (i = 0; i < n; i++)
15                 scanf("%d", &a[i]);
16             sort(a, a+n);
17             time += a[n-1] * 10;
18             count = 1;
19             for (i = 0; i < n-1; i++)
20             {
21                 j = i+1;
22                 if (a[i] != a[j])
23                     count++;         
24             }
25             time += count * 5;    
26             printf("%d\n", time);
27         }    
28     }
29     return 0;
30 }

  

     

原文地址:https://www.cnblogs.com/windysai/p/3085128.html