标签:贪心
input | output |
---|---|
4 1 10 5 2 |
17 |
题目:有n个人在雷区的左边。他们各自有自己跨越雷区的所需时间。他们只有一个扫雷器。为了能安全通过,他们只能两个人或者一个人带着扫雷器在雷区里走。两个人走过雷区的时间,以时间长的算。因为只有一个扫雷器,如果左边还有人,右边的人还要把扫雷器送回到左边。
注意开始只有两个人的时候的特判。
走法:当人数大于不等于四个人的时候。 有两种走法。 挑出 走的最快的a,第二快的b。然后再从 最慢的 z,和第二慢的 y开始。 原则 是a,b来送z和y过去,但是a,b 要回到左边。这里有两种走法,一种只用到a, a和z一起过去,再a一个人回来,再a和y一起过去,再a回来。耗时是a*2+y+z。 第二种走法是,a和b过去,a一个人回来,y和z一起过去,b一个人把扫雷器带回来。 耗时是 b*2+a+z。
再计算 三个人和四个人的情况就好了。见代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> using namespace std; #include <vector> int main() { int n; int arr[110]; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) cin>>arr[i]; sort(arr,arr+n); if(n==2) { cout<<arr[1]<<endl; continue; } int j=n-1; int ans=0; for(;j>=4;j-=2) { ans+=min(arr[0]*2+arr[j]+arr[j-1],arr[0]+arr[1]*2+arr[j]);//四个人以上的情况 } if(n&1) ans+=arr[0]+arr[j]+arr[j-1];//最后三个人 else ans+=min(arr[0]*2+arr[1]+arr[j]+arr[j-1],arr[0]+arr[1]*3+arr[j]);//最后四个人 cout<<ans<<endl; } return 0; }
标签:贪心
原文地址:http://blog.csdn.net/u013532224/article/details/44280349