您的位置:首页 > 其它

POJ1700

2016-03-29 14:39 225 查看
Problem: Crossing River

Description: N个人过河,只有一条船。船到了对岸得有人把船划回来。一条船最多坐两个人,过河的时间以慢的为准,问最少需要多少时间才能把所有的人都送到对岸。

Solution: 贪心,首先想到的贪心是,时间多的人要带时间次多的人过河,这个很简单想,于是我们要先对时间进行排序。然后就是痛苦的开始了。我开始想着划船肯定要用时间最少的人来划船,于是一直过不了样例。后来看了下别人的想法,于是明了了,我们还有一种过河方式,就是先让时间最少的两个人先到对岸去,然后随便哪一个把船划回来,然后再让时间最多的两个人同时过河,再让留在对面时间最少的那一个人把船划回来。这样计划有可能比分两次让时间最多和时间次多的人过河时间少。于是,我们就比较一下这两种方式,哪种时间少就用哪种,等到没过河的人少于4个时,这个时候就直接计算就可以了(少于4个人的情况很简单吧)。

Code(C++):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MIN(a,b) ((a)>(b)? (b):(a))

const int M=1005;

int n;
int people[M];

int cmp(const void *a,const void *b)
{
return *((int *)a)-*((int *)b);
}

int main()
{
int N;
for(scanf("%d",&N);N--;){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&people[i]);
qsort(people,n,sizeof(people[0]),cmp);

int ans=0;
int loop=n-1;
while(true){
if(!loop){
ans+=people[0];
break;
}else if(loop==1){
ans+=people[1];
break;
}else if(loop==2){

4000
ans+=people[2]+people[1]+people[0];
break;
}else
ans+=MIN(2*people[0]+people[loop]+people[loop-1],
people[0]+2*people[1]+people[loop]);
loop-=2;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: