标签:
| Time Limit: 500MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
| input | output |
|---|---|
4 1 10 5 2 |
17 |
题目讲n个士兵过雷区,可就一个探测器,每次最多两个人一起走,还要有一个人把探测器拿回了,一直到全部人渡过雷区。一起走时即较慢的那个人的用时,求所用最短的时间
先讲下例子的走法,1和2过去(2),2回来(2+2),5和10过去(2+2+10),1回来(2+2+10+1),1和2再回去(2+2+10+1+2)。脑子笨这个例子就想了好久。
先排序,然后可能得最优解法有两种:
1.最小两个过去,最小的一个把探测器带回来,再带最大的过去,再带第二大的过去……
2.最小的两个过去,最小的回来,最大两个过去,第二小的回来……
要注意下结束条件,然后就交给递归吧。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
#include<cmath>
#include<utility>
#include<vector>
using namespace std;
#define eps 1e-6
#define inf 0x3f3f3f3f
int a[1010];
int count(int n)
{
if(n==2)
{
return a[1];
}
if(n==3)
{
return a[0]+a[1]+a[2];
}
if(2*a[0]+a[n-1]+a[n-2]<a[0]+a[1]+a[n-1]+a[1])
{
return 2*a[0]+a[n-1]+a[n-2]+count(n-2);
}
else
{
return a[0]+a[1]+a[n-1]+a[1]+count(n-2);
}
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
scanf("%d",a+i);
}
sort(a,a+n);
cout<<count(n)<<endl;
}
return 0;
}标签:
原文地址:http://blog.csdn.net/qq_18738333/article/details/45162935