您的位置:首页 > 其它

poj 1700 poj 3404

2011-04-26 09:16 127 查看
经典的过桥问题。只要这两道题一起做,就可以做对了(之前老是考虑少一种情况。。。思维能力有待提高)。

具体解法如下:

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=0;
}
else
{
if(2*a[2]<a[1]+a[n-1])
{
ans+=a[1]+2*a[2]+a
;
n-=2;
}
else
{
ans+=2*a[1]+a[n-1]+a
;
n-=2;
}
}
}
printf("%d/n",ans);

return 0;
}

poj 3404 的只要把case那个去掉即可,看了题目就懂了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: