ACM: 贪心法 poj 1700
2016-05-19 23:21
330 查看
Crossing River
Description
A group of N people
wishes to go across a river with only one boat, which can at most
carry two persons. Therefore some sort of shuttle arrangement must
be arranged in order to row the boat back and forth so that all
people may cross. Each person has a different rowing speed; the
speed of a couple is determined by the speed of the slower one.
Your job is to determine a strategy that minimizes the time for
these people to get across.
Input
The first line of
the input contains a single integer T (1 <= T
<= 20), the number of test cases. Then T cases
follow. The first line of each case contains N, and the second line
contains N integers giving the time for each people to cross the
river. Each case is preceded by a blank line. There won't be more
than 1000 people and nobody takes more than 100 seconds to
cross.
Output
For each test case,
print a line containing the total number of seconds required for
all the N people to cross the river.
Sample Input
1
4
1 2 5 10
Sample Output
17
题意: 要全部人过河, 每次穿只可以载两个人,
过河的时间是按照时间长的人计算(两人过河的情况).
解题思路:
1. 贪心法: 剩下3个人一下可以直接计算. 下面是人数>=4的情况.
决策1: 先最快的和次快的过河, 最快的将船划回来, 再当前最慢和次慢的一起过河,
次快的将船划回来.(完成了将当前最慢和次慢送过河)
int t1 = a[1] + a[0] + a
+ a[1];
决策2: 每次都是最快和当前最慢的一起过河,最快的将串划回来.
int
t2 = 2*a[0] + a
+ a[n-1];
每次都选出这次决策的最优解. sum += min(t1,t2);
2. 剩下3人的情况: sum += a[2] + a[0] + a[1];
剩下2人的情况:
sum += a[1];
剩下1人的情况:
sum += a[0]; (只有一个人的情况)
代码:
#include
<cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAX 1005
int n;
int a[MAX];
int cmp(const void *a,const void *b)
{
return *(int*)a - *(int*)b;
}
inline int min(int a,int b)
{
return a < b ? a : b;
}
int main()
{
// freopen("input.txt","r",stdin);
int caseNum;
int i;
scanf("%d",&caseNum);
while(caseNum--)
{
scanf("%d",&n);
for(i = 0; i <
n; ++i)
scanf("%d",&a[i]);
qsort(a,n,sizeof(a[0]),cmp);
int sum =
0;
for(i = n-1; i >
2; i -= 2)
{
int t1 =
2*a[1] + a[0] + a[i];
int t2 =
2*a[0] + a[i] + a[i-1];
sum +=
min(t1,t2);
}
if(i == 2) sum
+= a[2] + a[0] + a[1];
else if(i == 1) sum +=
a[1];
else sum += a[0];
printf("%d\n",sum);
}
return 0;
}
相关文章推荐
- ACM: 树状DP 动态规划题 poj 1463 …
- 第一章 答疑摘选
- ACM: 简单动态规划题 poj 2955
- Smooth Rotation of Object in UNITY
- spark-graphx新的里程碑GraphDataFrames
- ACM: 最大流问题 图论题 poj 2263
- ACM: 图论题+记忆DP poj 2662 (边…
- ACM: 二分图最大匹配 图论题 poj 2…
- ACM: 有向欧拉图 图论题 poj 1386 …
- ACM: 二分图最佳匹配 图论题 poj 3…
- ACM: 动态规划 poj 1014
- ACM: 搜索题 poj 1691 一觉醒来居…
- ACM: 动态规划 黑书上的题目
- ACM: 动态规划 华东师范OJ 1244 …
- ACM: 动态规划 poj 2192
- ACM: 变形的最大公共自序列 动态规…
- ACM: 暴力题 poj 1338
- ACM: 动态规划 poj1695
- ACM: poj 1050
- ACM: 动态规划 poj 1887