POJ 1700贪心算法

来源:互联网 发布:软件开发部门职责 编辑:程序博客网 时间:2024/06/05 08:20

今天晕了一天啊,感觉什么都做不下去。这是今天做出来的一道题。

http://poj.org/problem?id=1700

题目非常简单,一群人去过河,但只有一条船,每次只能载两个人。这两个过河的速度取决于较慢的那一个。那么就有两种策略进行贪心,即划船最快的人带所有人过河,或者划船最慢的人和划船第二慢的人一起过河。开始是我们先让划船最快的两个人过河,然后对划船最慢的人进行讨论。

第一种情况:用最快的人带他们过河  time=2*val[1]+val[lowest]+val[lowest-1]

第二种情况:即他们俩一起过河:time=2*val[2]+val[1]+val[lowest]

                        即在此时1划船回来让他们过河,然后对岸的2划船回来接1过河。

那么,注意当只剩余1个人的情况(即1划船回来接他过河),就可以得到结果啦!!!

下面附上代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<vector>#include<cmath>using namespace std;int value[1005], n,ans;bool comp(int a, int b){return a < b;}int main(){int i, t,stat,end,last_num;cin >> t;while (t--){memset(value, 0, sizeof(value));cin >> n;for (i = 1; i <= n; i++)cin >> value[i];sort(value + 1, value + n + 1, comp);stat = 1; end = n; last_num = n-2;ans = value[2];                       //进行初始化操作if (n == 1 || n == 2){cout << max(value[1], value[2]) << endl;continue;}                                      //枚举只有1个或2个人的情况while (last_num >0){if (last_num == 1){ans += value[1] + value[3];     //只有1个人时的情况break;}else if (2 * value[2] > value[1] + value[last_num+1])ans += 2 * value[1] + value[last_num+2] + value[last_num+1];elseans += 2 * value[2] + value[last_num+2]+value[1];last_num -= 2;}cout << ans << endl;}return 0;}


0 0
原创粉丝点击