题意:一天夜晚,有n个人想渡河,每个人的渡河时间都不一样,每次只允许一个或两个人渡河,其中一个人需要拿着手电筒。问多久所有人才能成功渡河?
分析:假设n个人的渡河时间从小到大分别为spend[1]、spend[2]。。。spend[n-1]、spend[n]
当n==1时,渡河时间Sum_time=spend[1];
当n==2时,渡河时间Sum_time=spend[2];
当n==3时,渡河时间Sum_time=spend[2]+spend[1]+spend[3];
当n==4时,可分两种情况:
- 用速度最快的依次去接其他人过河
Sum_time=spend[4]+spend[1]+spend[3]+spend[1]+spend[2]; - 用速度最快的和次快的协作去接其他人过河
Sum_time=spend[2]+spend[1]+spend[n]+spend[2]+spend[2];
当n>4时,可按装n==4的策略进行接人渡河
-
用速度最快的依次去接其他人过河
Sum_time=spend[n]+spend[1]+spend[n-1]+spend[1]; -
.用速度最快的和次快的协作去接其他人过河
Sum_time=spend[2]+spend[1]+spend[n]+spend[2];
AC完整代码:
#include<iostream>
#include<algorithm>
using namespace std;
int spend[1001];
int cmp(int a,int b)
{
return a<b;
}
int main()
{
int N;
cin>>N;
while(N--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>spend[i];
sort(spend+1,spend+n+1,cmp);*//对渡河人时间进行从小到大排序*
int Sum_time=0;
while(n>0)
{
if(n==1)
{
Sum_time+=spend[1];
}
else if(n==2)
{
Sum_time+=spend[2];
break;
}
else if(n==3)
{
Sum_time+=spend[2]+spend[1]+spend[3];
}
else if(n>=4)
{
Sum_time+=min(spend[2]+spend[1]+spend[n]+spend[2],spend[n]+spend[1]+spend[n-1]+spend[1]);
*//两种情况进行比较选取其中一种*
}
n=n-2;*//每次渡河成功的人数为2个*
}
cout<<Sum_time<<endl;
}
}