您的位置:首页 > 其它

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

2013-05-18 11:22 281 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4505

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

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

wa代码

#include <iostream>
using namespace std;

int main()
{
int a[20], i, j, k, c, n, time;
while (cin >> c)
{
while (c--)
{
scanf("%d", &n);
time = n;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (i = 0; i < n; i++)
{
for (j = i+1; j < n; j++)
{
if (a[i] == a[j])     //在数组里删掉相同的数,剩下来的n表示总共要开多少次门
{
for (k = j; k < n-1; k++)
a[k] = a[k+1];
n--;
j--;      //必须的,因为有可能删除之后,下一个数又跟a[i]相同
}
}
}
time += n * 5;
time += a[0] * 6;      //从这里开始就是问题代码了
for (i = 0; i < n-1; i++)
{
if (a[i+1] > a[i])
time += (a[i+1] - a[i]) * 6;
else
time += (a[i] - a[i+1]) * 4;
}
time += (a[n-1] * 4);
printf("%d\n", time);
}
}
return 0;
}


一开始以为没有处理:如果那些人要去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代码:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
int a[20], i, j, c, n, time, count;
while (cin >> c)
{
while (c--)
{
scanf("%d", &n);
time = n;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
time += a[n-1] * 10;
count = 1;
for (i = 0; i < n-1; i++)
{
j = i+1;
if (a[i] != a[j])
count++;
}
time += count * 5;
printf("%d\n", time);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: