poj 3404 Bridge over a rough river(过桥问题)

题目链接:http://poj.org/problem?id=3404

Bridge over a rough river

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4024   Accepted: 1644

Description

A group of N travelers (1 ≤ N ≤ 50) has approached an old and shabby bridge and wishes to cross the river as soon as possible. However, there can be no more than two persons on the bridge at a time. Besides it‘s necessary to light the way
with a torch for safe crossing but the group has only one torch.

Each traveler needs ti seconds to cross the river on the bridge; i=1, ... , N (ti are integers from 1 to 100). If two travelers are crossing together their crossing time is the time of the slowest
traveler.

The task is to determine minimal crossing time for the whole group.

Input

The input consists of two lines: the first line contains the value of N and the second one contains the values of ti (separated by one or several spaces).

Output

The output contains one line with the result.

Sample Input

4
6 7 6 5

Sample Output

29

Source

Northeastern Europe 2001, Western Subregion

思路:

n==1时,直接输出答案

n==2时,输出最大值

n==3时,输出三者和

n>=4时,两种策略,均转化成4人时的情形求最优解。设4人过河速度为A<B<C<D,那么有两种策略:

先AB过,A回,CD过,B回,即temp=A+2*B+D

先AD过,A回,再AC过,A回,即temp=2*A+C+D(忘了这种情况)

然后取其中的最小值即可。也就是说,在2*B<A+C时选方案1,否则选方案2.

代码如下:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define PI acos(-1.0)
#define INF 0x3fffffff
//typedef long long LL;
//typedef __int64 LL;
const int M = 1017;
int main()
{
	int n;
	int a[M];
	int i;
	while(~scanf("%d",&n))
	{
		for(i = 1; i <= n; i++)
		{
			scanf("%d",&a[i]);
		}
		if(n == 1)
		{
			printf("%d\n",a[1]);
			continue;
		}
		sort(a+1,a+n+1);
		if(n == 2)
		{
			printf("%d\n",a[2]);
			continue;
		}
		if(n == 3)
		{
			printf("%d\n",a[1]+a[2]+a[3]);
			continue;
		}
		int sum = 0;
		while(n)
		{
			if(2*a[2] < a[1]+a[n-1])
			{
				sum+=a[1]+2*a[2]+a[n];
				n-=2;
			}
			else
			{
				sum+=2*a[1]+a[n-1]+a[n];
				n-=2;
			}
			if(n <= 3)
				break;
		}
		if(n == 1)
			sum+=a[1];
		else if(n == 2)
			sum+=a[2];
		else if(n == 3)
		{
			printf("%d\n",sum+a[1]+a[2]+a[3]);
			continue;
		}
		printf("%d\n",sum);
	}
	return 0;
}

poj 3404 Bridge over a rough river(过桥问题)

时间: 2024-10-10 16:21:37

poj 3404 Bridge over a rough river(过桥问题)的相关文章

poj 3404&amp;&amp;poj1700(贪心)

Bridge over a rough river Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4143   Accepted: 1703 Description A group of N travelers (1 ≤ N ≤ 50) has approached an old and shabby bridge and wishes to cross the river as soon as possible. Ho

poj 2573 Bridge (过桥问题 贪心)

对于此问题有两种策略 1.最快的带最慢的和次慢的 2.最快和次快带最慢和次慢 此链接有详细解释点击打开链接 <span style="font-size:18px;"><span style="font-size:24px;">#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using nam

poj 3608 Bridge Across Islands 两凸包间最近距离

1 /** 2 旋转卡壳,, 3 **/ 4 #include <iostream> 5 #include <algorithm> 6 #include <cmath> 7 #include <cstdio> 8 using namespace std; 9 10 const double eps = 1e-8; 11 struct point { 12 double x,y; 13 point(double x=0,double y =0):x(x),y(

POJ 3608 Bridge Across Islands --凸包间距离

题意: 给你两个凸包,求其最短距离. 解法: POJ 我真的是弄不懂了,也不说一声点就是按顺时针给出的,不用调整点顺序. 还是说数据水了,没出乱给点或给逆时针点的数据呢..反正WA了几发就是了. 求凸包最短距离还是用旋转卡壳的方法,这里采用的是网上给出的一种方法: 英文版:        http://cgm.cs.mcgill.ca/~orm/mind2p.html 中文翻译版:  http://www.cnblogs.com/bless/archive/2008/08/06/1262438.

poj 3068 Bridge Across Islands

Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11196   Accepted: 3292   Special Judge Description Thousands of thousands years ago there was a small kingdom located in the middle of the Pacific Ocean. The territory

POJ 3608 Bridge Across Islands

WA了好多次 说一下错误 第一个地方是旋转卡壳是要进行两次的 第二个地方其实也不算错误,应该是程序运行的精度问题 在下面这部分程序中 //while((tmp=(p[(miny+1)%n]-p[miny])^(p[maxy]-p[(maxy+1)%m]))<-eps) maxy=(maxy+1)%m;//只要在向量miny-miny+1右侧则说明在向对踵点对的方向靠 while((tmp=Get_angle(p[miny],p[miny+1],q[maxy],q[maxy+1]))<-eps)

POJ 2573 Bridge 【模拟+分治】

题目: n人希望在晚上过河. 最多两人可以组成一组一起过河,每组必须有手电筒. 在n个人中只有一个手电筒,所以必须安排过河顺序,以便及时返回手电筒使得更多的人可以过河.每个人的过河速度都不同; 每一组的速度由较慢成员的速度决定. 你的任务就是确定一个方案,让所有的人在最短的时间内过河并且输出方案. 分析: 此题其实本来是没有思路的,但是 ,通过排序,我们发现:既然每次都得一个人传递手电筒,为什么不让最快的那个人传呢(其实同时需要a[1],a[2]两个人配合,详见方案2)?又因为能者多劳,因此每次

[转] POJ几何分类

转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板.如果代码一片混乱,那么会严重影响做题正确率.4.注意精度控制.5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2).因为整数不用考虑浮点误差,而且运算比浮点快. 一.点

【转】计算几何题目推荐

打算转下来好好做计算几何了. 原文地址:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行