nyoj 47 过河 过河问题 【贪心】

来源:互联网 发布:如何优化win7开机速度 编辑:程序博客网 时间:2024/05/01 05:13

经典贪心;

两种方案:一:让最快的和次最快的先过去,最快的回来,然后最慢的和次最慢的过去,次最快的回来a[0]+a[1]+a[1]+a[n-1]

二:最快的和最慢的过去,最快的回来,最快的和当前最慢的过去,最快的回来。a[0]+a[n-1]+a[0]+a[n-2]

每次取最优解。

注意:最后剩余没过的人小于等于3的时候,要特殊判断。

代码:

#include <cstdio>#include <cstring>#include <algorithm>#define INF 0x3f3f3f3fusing std::sort;int s[1005], ans, n;void solve(){ans = 0;int st = 0, en = n, len = 0;while(en > 3){int temp1 = s[en-1]+2*s[1]+s[0];int temp2 = 2*s[0]+s[en-1]+s[en-2];ans += temp1<temp2 ?temp1:temp2;en -= 2;}if(en == 3) ans += s[0]+s[2];ans += s[1];printf("%d\n", ans);}int main(){int t, i, j;scanf("%d", &t);while(t --){scanf("%d", &n);for(i = 0; i < n; i ++) scanf("%d", &s[i]);sort(s, s+n);if(n<3) printf("%d\n", s[n-1]);else solve();}return 0;}          

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=47


0 0
原创粉丝点击