F

- 题目大意

    某个公司只有一个电梯, 现在有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