n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?
输入
第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。 接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
输出
一行一个整数表示最少需要的独木舟数。
输入示例
3 6 1 2 3
输出示例
2
//错误代码 没有考虑不连续
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
long long a[10005],m,n,i,item=-1;
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
// for(i=1;i<=n;i++){
// printf("%lld ",a[i]);
// }
for(i=n;i>=1;i--){
if(a[1]+a[i]<=m){
item=i;
break;
}
}
// printf("%lld",i);
if(item!=-1){
if(i%2==0)
printf("%lld",n-i+i/2);
else
printf("%lld",n-i+i/2+1);
}
else printf("%lld",n);
return 0;
}
正解如下 贪心 挨个遍历
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
long long a[10005],m,n,i,sum=0,j;
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
i=1;j=n;
while(i<=j){
if(a[j]+a[i]<=m){
i++;j--;
sum++;
}
else if(a[i]+a[j]>m){
j--;
sum++;
}
}
printf("%lld",sum);
return 0;
}