POJ 4.6 702 Crossing River

7 篇文章 0 订阅
题意:
有n个人过河,只有一条船,每次只能坐2人,每个人过河所需时间不同,求全部过河所需的最短时间。

解题思路:
当人数等于1时:sum=Num[1];
当人数等于2时:sum=Num[2];
当人数等于3时:sum=Num[3]+Num[2]+Num[1];//设num[3]最慢 num[1]最快 最快的与最慢的先过 消耗num[3] 最快的回来接另一个 消耗num[1] 最后两个人一起过河 消耗num[2] 所以三个人时所需时间实际是三个人过桥时间之和
重点在这里OwO:
当人数大于等于4时:
若设过桥速度最快的那个人过桥时间为a,第二快为b;过桥第二慢的那个人过桥时间为c,最慢为d;
此时有两种过桥方案:
一.最快和次快的人先过,然后最快的回来,然后最慢与次慢的人再过,次快的回来;
二.最快的和最慢的过,快的回来,在和次慢的过,快的再回来;
第一种方法时间为b*2+a+d;
第二种方法时间为c+d+2*a
如果第一种大于第二种有2*b+a+d>c+d+2*a
化简得

2*b>c+a;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX=1006;
int n,Pe[MAX];
int main()
{
int t;
scanf("%d",&t);
while( t-- )
{
scanf("%d",&n);
for( int i=1; i<=n; ++i )
scanf("%d",&Pe[i]);
sort(Pe,Pe+n+1);
int sum=0;
while( n )
{
if(n==1)
{
sum+=Pe[1]; break;
}
else if( n==2 )
{
sum+=Pe[2]; break;
}
else if( n==3 )
{
sum+=Pe[3]+Pe[1]+Pe[2]; break;
}
else{
if( 2*Pe[2]>Pe[1]+Pe[n-1] )
sum+=2*Pe[1]+Pe[n-1]+Pe[n];
else
sum+=2*Pe[2]+Pe[1]+Pe[n];
n-=2;
}
}
printf("%d\n",sum);
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值