POJ1700解题报告

题意:一天夜晚,有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时,可分两种情况:

  1. 用速度最快的依次去接其他人过河
    Sum_time=spend[4]+spend[1]+spend[3]+spend[1]+spend[2];
  2. 用速度最快的和次快的协作去接其他人过河
    Sum_time=spend[2]+spend[1]+spend[n]+spend[2]+spend[2];

当n>4时,可按装n==4的策略进行接人渡河

  1. 用速度最快的依次去接其他人过河
    Sum_time=spend[n]+spend[1]+spend[n-1]+spend[1];

  2. .用速度最快的和次快的协作去接其他人过河
    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;
	}
}

上一篇:机试-求解最大花费金额-C语言


下一篇:浅谈Spring中JDK动态代理与CGLIB动态代理