您的位置:首页 > 其它

积分赛 (一)——51Nod - 1432 【贪心】

2018-03-29 00:17 190 查看
魔法学院放暑假了,WC和他的一帮魔友一起去弗尔夫斯基山脉玩。莫伊拉同学突然想划船到对岸找被削的Mercy玩,这里的每一艘船都是同一型号,能承受的重量都是一样的,并且每艘船都可以坐一个或者两个人。WC他们共有n个人,现在我们知道他们每个人的质量,而且每个人体重也不超过船的承重。可惜经费有限,他们必须租尽可能少的船,请问他们最少要租几艘船? 
Input第一行包含两个正整数n 和m ,n<=10^4,m<=2*10^9,表示人的数量和船的最大承重。 接下来n行,每行一个正整数,表示每个人的体重。体重不超过m。 
Output一行一个整数表示最少需要的独木舟数。Sample Input
3 6
1
2
3
Sample Output2这道题比赛的时候一开始自己的思路就错了,然后就一口气错了7次(当时怎么就不想想自己的思路有问题呢),我最开始的思路是:排序有小到大,然后让重量较小的两个放在一条船上,后来发先思路错了,比如1 2 3 4 5,载重为6,如果按错误的思路需要4条船,而实际最少只要3条船。正确的思路是:这道题的题面就比较有意思,说每个人的体重不超过船的最大载重,并且每条船只能载1~2人,所以要想使用的船最少就尽可能的优先安放体重较大的船,让体重较大的人和体重较小的人放在一条船上尽可能保证体重较大的人不会单独占用一条船。#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL a[100010];
bool cmp1(LL a,LL b){
return a<b;
}
int main(){
LL n,m;
while(scanf("%lld %lld",&n,&m)!=EOF){
LL i=0,ans=0;
for(i=0;i<n;i++){
scanf("%lld",&a[i]);
}
sort(a,a+n,cmp1);
LL left=0,right=n-1;//采用极端贪心策略
while(left<=right){
if(a[left]+a[right]<=m){
ans++;
left++;
right--;
}
else{
ans++;
right--;
}
}
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心算法