1432 独木舟
n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?
输入:
第一行包含两个正整数n (n<=10000)和m (m<=2000000000),表示人数和独木舟的承重。
接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
Output
一行一个整数表示最少需要的独木舟数。
Input示例
3 6
1
2
3
Output示例
n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?
输入:
第一行包含两个正整数n (n<=10000)和m (m<=2000000000),表示人数和独木舟的承重。
接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
Output
一行一个整数表示最少需要的独木舟数。
Input示例
3 6
1
2
3
Output示例
2
想复杂了,以为贪心是重量尽可能的大,其实不是的,只要最大值+最小值<=m就可以用一条船,如果不行的话,那么直接最大值走,我原先的想法是,找到最大值+尽可能大的值<=m,其实这是多此一举的,把数值分为最大值 次最大值 次最小值 最小值,那么如果max+min<=m 且max+次min<=m ,那么我们取max+min<=m和max+次min<=m是一样的,因为次最大值<最大值,因此他们总和都是一样的,如果max+次min<=m不符合,那么我们直接取前一个就好了,因为这是当前的最优策略。
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int cmp(int a,int b) { return a>b; } long long a[10009]; int main() { int n,i,j,k; long long ans=0,m; scanf("%d%lld",&n,&m); for(i=0; i<=n-1; i++) { scanf("%lld",&a[i]); } sort(a,a+n,cmp); int max=0,min=n-1; for(i=0; max<=min; i++) { if(a[max]+a[min]<=m) { max++; min--; ans++; } else { max++; ans++; } } //for(i=0; i<=n-1; i++) if(a[i]!=-1) ans++; printf("%lld\n",ans); }