题目链接:fzu2306
解题思路:每个小的最好能依赖于比他大的而自己形成一队,而由于队列的关系,那个大的此时也依赖于下一个,于是最好的排列一定是一大一小交叉的,双指针可以有效地实现这个逻辑。
Code:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = (int)1e5+5;
int arr[maxn];
int main() {
int n, ret, w, ctr;
while(scanf("%d%d", &n, &w) != EOF) {
ret = 0;
for(int i=0; i<n; i++) scanf("%d", arr+i);
sort(arr, arr+n);
int l=0, r=n-1, ctr=0;
while(l<r) {
if(arr[l]+arr[r] > w) {
if(ctr&1) r--;
else l++;
ret++;
ctr = !ctr;
continue;
}
l++;
}
ret += n-ret+1>>1;
printf("%d\n", ret);
}
return 0;
}