题干:

n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 

Input

第一行包含两个正整数n (0 接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。

Output

一行一个整数表示最少需要的独木舟数。

Sample Input


3 6 1 2 3

Sample Output


2

 

解题报告:

   排序后贪心就好了。。贪心正确性不难证明在此不作过多说明。

AC代码:

#include<bits/stdc++.h>
#define LL long long

using namespace std;

LL w[10000+5];
int main()
{
LL n,m;
scanf("%lld%lld",&n,&m);
LL i;
for(LL i = 0; i<n; ++i) scanf("%lld",&w[i]);
sort(w,w+n);//按照重量从小到大排序
LL sum=0;
LL l = 0,r = n-1;
while(l<=r) {
if(w[l] + w[r] <= m) {
l++;r--;sum++;
}
else {
r--;
sum++;
}
}
printf("%lld\n",sum);
return 0;
}

还有的人用vector写的,排序不变。。。每次读取front和back,然后做erase开头 和 pop_back的操作。。其实这个复杂度好像要高一些?