F - Elevator Stopping Plan (UVALive - 2949)

- 题目大意

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

F - Elevator Stopping Plan (UVALive - 2949)的相关文章

贪心算法之Elevator Stopping Plan

Elevator Stopping Plan Description ZSoft Corp. is asoftware company in GaoKe Hall. And the workers in the hall are veryhard-working. But the elevator in that hall always drives them crazy. Why?Because there is only one elevator in GaoKe Hall, while t

1030 Travel Plan (30 分)

1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting ci

UVALive 4987---Evacuation Plan(区间DP)

题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2988 problem Description Flatland government is building a new highway that will be used to transport weapons from its main weapon plan

hdu 5290 Bombing plan(树形dp)

题目链接:hdu 5290 Bombing plan dpDestroy[u][i]表示以u为根节点的子树全部被摧毁,并且向上还可以破坏到距离u为i的城市:dpSafe[u][i]表示以u为根节点的子树中有距离u深度为i的城市还未被破坏. dpDestroy[u][i] = dpDestroy[v][i+1] + sum{ min(dpDestroy[k][j], dpSafe[k][j])(j≤i)| k为除了v以外的子节点} dpSafe[u][i] = dpSafe[v][i-1] + s

Codeforces 589F F. Gourmet and Banquet(二分+贪心)

题目地址:http://codeforces.com/problemset/problem/589/F 思路:先贪心按照右端点值排序(先把对后面影响最小的菜吃掉),二分吃每道菜的时间即可. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=105; const int maxt=1e5+50

第4章 部署模式 Deployment Plan(部署规划)

已开发了基于组件的应用程序,该应用程序在逻辑上构造为多层结构,如 Three-Layered Services Application. 中所述.您希望将它分布到一组在物理上为多级结构的服务器上,如 Tiered Distribution 中所述. 图 1: 三层服务应用程序 影响因素 确定将组件部署到哪一级时,必须在实际环境的上下文中考虑下列影响因素: Layered Application 主要涉及对组件之间的设计依赖性进行管理,而"分级分布"则涉及对运行时服务器配置进行优化以满足

F.I.S初探(前端工程化)

一.初识FIS 在做项目中遇到了静态资源浏览器缓存更新的问题,于是在网络上寻找解决方案.之前虽然没有解决过这个问题,但方法无非就是为其设定新URI使得浏览器强制更新.这个过程听起来还是相当简单的. 也是无意中搜索到了知乎上的一个帖子大公司里怎样开发和部署前端代码? 看到这个文章中提到了FIS,跟随着文章开始学习走起,有点小兴奋,只不过很快便发现问题更多. 二.尝试 原本只是想着有个工具可以将前端资源打个标识,这样就可以轻松的解决浏览器静态缓存更新问题.FIS的描述也确实如此,那么就开始动手搞起吧

H - Aquarium (UVALive - 7303 )

- 题目大意 给你一个r * c的格子,每个格子有一个 ' \ ' 或者 '/' 的墙,以及打掉墙的费用,问使得所有块联通的最小费用.(自己可以配合图来看好理解一点) - 解题思路 我们可以将其转化成联通块的问题,就是把每个格子看成两部分,左侧和右侧.以一行来看,假设两个格子A,B.那么B格子的右侧的编号一定和A格子的左侧的编号相同.给每个格子的左右侧标上号,然后加入边,边的两个端点为一个格子的两个编号.权值为墙的费用然后处理行与行之间的边,然后假设上边格子为A,下面格子为B.那么如果A是'/'

F - Goldbach`s Conjecture(哥德巴赫猜想)

题目大致的意思是输出一个偶数总共有多少个素数对构成哥德巴赫猜想(PS:陷阱好多,稍一不慎就超内存了) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 const long long maxn=1e7+5; 8 9 bool ip[maxn];//使用long long会超内存 10 long long T,n,p[1000005];//