上船问题。
排序之后枚举最大重量就可以了。
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ;
#define mem(a) memset(a,0,sizeof(a))
#define inf 100000005
int const maxn = 10005;
long long a[maxn];
long long n,m ;
bool vis[maxn];
int main()
{
while(scanf("%I64d%I64d",&n,&m)!=EOF)
{
for(int i = 0 ; i < n ; i++)
{
scanf("%I64d",&a[i]);
}
sort(a,a+n);
mem(vis);
int ans = 0 ;
for(int i = n-1 ; i >= 0 ; i--)
{
if(vis[i])continue;
vis[i] = true ;
int j ;
for(j = 0 ; j < i ; j++)
{
if(vis[j])continue;
if(a[i]+a[j]>m)break;
}
while(j>0&&vis[j-1])
{
j--;
}
if(j>0)vis[j-1] = true ;
ans++;
}
printf("%d\n",ans);
}
return 0 ;
}