poj - 1700 题解

大概题意:N个人要过河,一个船最多承载两人,且过河速度等于船上划船速度最慢的人的速度,求过河的最短时间。

题目解法:首先对题目进行分析,可以发现:船过了河还要有一个人再把船送回来。

假设把人按过河速度从大到小排序并编号1-4,则会发现有两种过河方式:1.13一组,1回来,24一组,2回来,12一组,完成;2.12一组,1回来,13一组,1回来,14一组,完成。

因此贪心策略就是:把人按过河速度从大到小排序,然后按上述方式过河,每次选取最优方式。

代码如下:

 1     #include<iostream>
 2     #include<algorithm>
 3     using namespace std;
 4     int a[1001];
 5     bool com(const int& x,const int& y)
 6     {
 7         return x<y;
 8     }
 9     int main()
10     {
11         int T;
12         cin>>T;
13         for(int t=1;t<=T;t++)
14         {
15             int n;
16             cin>>n;
17             for(int i=1;i<=n;i++)
18             {
19                 cin>>a[i];
20             }
21             sort(a+1,a+n+1,com);
22             if(n==1)
23             {
24                 cout<<a[1]<<endl;
25                 continue;
26             }
27             if(n==2)
28             {
29                 cout<<a[2]<<endl;
30                 continue;
31             }
32             if(n==3)
33             {
34                 cout<<a[2]+a[1]+a[3]<<endl;
35                 continue;
36             }
37             int res=a[2];
38             int tip=n;
39             if(n%2==0)
40             {
41                 while(tip>=4)
42                 {
43                     int t1=a[1]+a[2]+a[2]+a[tip];
44                     int t2=a[tip]+a[1]+a[tip-1]+a[1];
45                     res+=min(t1,t2);
46                     tip-=2;
47                 }
48             }
49             else
50             {
51                 while(tip>=5)
52                 {
53                     int t1=a[1]+a[2]+a[2]+a[tip];
54                     int t2=a[1]+a[tip]+a[1]+a[tip-1];
55                     res+=min(t1,t2);
56                     tip-=2;
57                 }
58                 res+=a[1]+a[3];
59             }
60             cout<<res<<endl;
61         }
62         return 0;
63     }
时间: 2024-11-04 20:31:12

poj - 1700 题解的相关文章

POJ 1700 Crossing River(贪心)

V - Crossing River Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1700 Description A group of N people wishes to go across a river with only one boat, which can at most carry two persons. There

poj 1700

http://poj.org/problem?id=1700 题目大意就是一条船,有N个人需要过河,求N个人最短过河的时间 #include <stdio.h> int main() { int t[1001],T,j,i,n,sum; scanf("%d",&T); for(i=0;i<T;i++) { scanf("%d",&n); for(j=0;j<n;j++) scanf("%d",&t[

poj 1700 Crossing River C++/Java

http://poj.org/problem?id=1700 题目大意: 有n个人要过坐船过河,每一个人划船有个时间a[i],每次最多两个人坐一条船过河.且过河时间为两个人中速度慢的,求n个人过河的最短时间. 思路: 贪心. 对于每次过河的,有两种情况: //最快和最慢过去,然后最快回来.在和次慢过去.最快回来 int action1=a[i-1] + a[0] + a[i-2] +a[0]; //最快和次慢过去,然后最快回来,在次慢和最慢过去,次慢回来 int action2=a[1] +a[

POJ 1700 经典过河问题(贪心)

POJ题目链接:http://poj.org/problem?id=1700 N个人过河,船每次最多只能坐两个人,船载每个人过河的所需时间不同,问最快的过河时间. 思路: 当n=1,2,3时所需要的最小时间很容易求得,现在由n>=4,假设n个人单独过河所需要的时间存储在数组t中,将数组t按升序排序,那么 这时将单独过河所需要时间最多的两个旅行者送到对岸去,有两种方式: 1> 最快的(即所用时间t[0])和次快的过河,然后最快的将船划回来,再次慢的和最慢的过河,然后次快的将船划回来. 即所需时间

poj - 3641 题解

题意:检验一个数是否是质数,且满足ap = a (mod p) 题解:快速幂,质数检验 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 long long power(long long a,long long b,long long c) 7 { 8 long long res,t; 9 res=

poj - 3070 题解

题意:斐波那契数列的矩阵链乘求法. 题解:快速幂优化矩阵链乘解决. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 struct datatype 7 { 8 int a[2][2]; 9 }; 10 datatype multiple(datatype x,datatype y) 11 { 1

poj 1066 题解

题意:求从正方体外面到达这个黑点所需穿过的最少线段数(规定只能从线段中点穿过,包括最外层的墙),共有n面墙 0 <= n <= 30 题解:事实上枚举边界上的中点,判断它和黑点的线段与这些墙的交点数即可 解释:注意到,墙这一长线段相对于黑点连线,等价于直线--无论是在实现上还是题意上.连线若与墙相交,则黑点与枚举点必在墙两侧,无可避免地要穿过这面墙,至于从线段中点穿过在本题中是没有意义的.起始点选取本该在线段中点,但显然选取两个端点的最小值不会比它差,而一个端点的结果不会比相邻的两个中点结果好

[ACM] poj 1700 Crossing River (经典过河问题)

Crossing River Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10212   Accepted: 3855 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 arr

poj 1556 题解

题意:如图,大概猜的到了?最多18面墙,每面墙上两个门,从(0,5)走到(10,5)的最短距离,保留两位小数 题解:这道题非常贴心地按序给出墙的坐标,把每个端点当做图里面的一个节点,用O(n3)时间判断每两点之间是否能连边,判断方法为判断直线与线段是否相交(事实上是两个线段,但在这道题里面用直线交线段即可),跑一个最短路即可(既然已经到了三次方级别,干脆写了最短的Floyd) #include<cmath> #include<cstdio> #include<cstring&