标签:des style blog io ar os sp for on
Description
Input
Output
Sample Input
1 4 1 2 5 10
Sample Output
17
这个题目第一反应是船回的时候,肯定让当前最快的人划回来,然后还考虑到,去的时候是按照最小速度的人,故让最慢的两个人过去,可能会减少时间。
于是,考虑两种贪心策略:
1、让最快的人来回载人过去。
2、先让最快的人和次快的人过去,然后让最快的人回来,让最慢和次慢的人过去,让对面最快的人回来。整体效果是最快和次快的人让最慢和次慢的人过去。
于是两者统一,就是让最慢和次慢的人每次渡河。比较两种策略的时间。
直到剩余两个或者三个人,就稍微考虑一下即可。另外不要忘了考虑初始只有一个人的情况。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <set> #include <map> #include <vector> #include <queue> #include <string> #define inf 0x3fffffff #define eps 1e-10 using namespace std; int n, a[1005]; bool cmp(int x, int y) { return x > y; } void Input() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &a[i]); sort(a, a+n, cmp); } int qt() { if (n == 1 || n == 2) return a[0]; int ans = 0; int top = 0, rear = n; while (rear - top > 3) { ans += min(a[rear-2]*2+a[rear-1]+a[top], a[top]+a[top+1]+2*a[rear-1]); top += 2; } if (rear - top == 2) ans += a[rear-2]; else ans += a[top] + a[rear-1] + a[rear-2]; return ans; } int main() { //freopen("test.txt", "r", stdin); int T; scanf("%d", &T); for (int times = 0; times < T; ++times) { Input(); printf("%d\n", qt()); } return 0; }
ACM学习历程——POJ 1700 Crossing River(贪心)
标签:des style blog io ar os sp for on
原文地址:http://www.cnblogs.com/andyqsmart/p/4116342.html