- 题目大意
某个公司只有一个电梯, 现在有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; }
原文地址:https://www.cnblogs.com/alpacadh/p/8449412.html
时间: 2024-10-09 17:16:06