经典的过桥问题。只要这两道题一起做,就可以做对了(之前老是考虑少一种情况。。。思维能力有待提高)。
具体解法如下:
n==1时,直接输出答案
n==2时,输出最大值
n==3时,输出三者和
n>=4时,两种策略,均转化成4人时的情形求最优解。设4人过河速度为A<B<C<D,那么有两种策略:
先AB过,A回,CD过,B回,即temp=A+2*B+D
先AD过,A回,再AC过,A回,即temp=2*A+C+D(忘了这种情况)
然后取其中的最小值即可。也就是说,在2*B<A+C时选方案1,否则选方案2.
多做dp和贪心题是锻炼思维的好方法,以后要多多训练思维才行。
以下是代码:(poj 1700)
- #include<cstdio>
#include<algorithm>
using namespace std;
const int M=1100;
int a[M];
int n; - int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int i;
bool flag=false;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int ans=0;
while(n)
{
if(n==1)
{
ans+=a[1];
n=0;
}
else if(n==2)
{
ans+=a[2];
n=0;
}
else if(n==3)
{
ans+=a[1]+a[2]+a[n];
n=0;
}
else
{
if(2*a[2]<a[1]+a[n-1])
{
ans+=a[1]+2*a[2]+a[n];
n-=2;
}
else
{
ans+=2*a[1]+a[n-1]+a[n];
n-=2;
}
}
}
printf("%d/n",ans);
}
return 0;
}
poj 3404 的只要把case那个去掉即可,看了题目就懂了。