- 题目大意
某个公司只有一个电梯, 现在有n 个人从1楼, 他们有各自想要到达的楼层, 然后电梯每上一楼需要4 秒, 每在一个楼层开门需要10 秒, 然后然爬楼梯的话需要20一楼。问, 如何用最短的时间让所有人都到达各自想要到的楼层。
- 解题思路
因为人可以爬楼梯, 所以可以在某个楼层下楼之后走楼梯到达想要到的楼层, 只要在最后一个人到达之前就可以。 对于时间可以采取二分的方式搜索, 所以只要判断某个时间能否将所有人送到指定楼层就可以了。 对于判断我们可以用贪心去做, 尽量让电梯停在较高的楼层,只要剩余的时间够使得人走到自己的楼层就可以了。
- 代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
bool vis[36];
int num[36];
int Max,sum;
int a = 0;
bool find(int t)
{
int i, j;
sum = 0;
memset(num, 0, sizeof(num));
i = t / 20 + 2;
while (i <=Max)
{
while (i < Max && !vis[i])
i++;
if (10 * sum + 4 * (i - 1) > t)
return false;
j = (t - 10 * sum + 20 * i + 4)/24;
i = (t - 10 * sum + 16 * j + 4) / 20+1;
num[sum++] = j;
}
return true;
}
int main()
{
int n, f;
while (cin >> n)
{
if (n == 0)
break;
Max = 0;
memset(vis, false, sizeof(vis));
while(n--)
{
cin >> f;
vis[f] = true;
Max = max(Max, f);
}
int l = 0, r = 14 * (Max - 1);
int m;
while (l < r)
{
m = (l + r + 1) / 2;
if (m == r)
break;
if (find(m))
r = m ;
else
{
l = m ;
}
}
find(m);
cout << m << endl;
cout << sum;
for (int i = 0; i < sum; i++)
{
cout <<" "<<num[i];
}
cout << endl;
}
return 0;
}