poj3663

排序之后,能与牛i + 1匹配的,一定能与牛i匹配,所以我们弄一个左指针l,从右向左看每一头牛,每次移动左指针,使左指针左面的都是满足的,右面的都是不满足的即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

const int maxn = 20002;

int main()
{
	//freopen("D:\\t.txt", "r", stdin);
	int n, s;
	int cow[maxn];
	scanf("%d%d", &n, &s);
	for (int i = 0; i < n; i++)
		scanf("%d", &cow[i]);
	sort(cow, cow + n);
	int l, ans = 0;
	l = 0;
	for (int i = n - 1; i >= 0; i--)
	{
		while (cow[l] + cow[i] <= s && l < n)
			l++;
		ans += l;
		if (l - 1 >= i)
			ans--;
	}
	printf("%d\n", ans / 2);
	return 0;
}
原文地址:https://www.cnblogs.com/rainydays/p/1948652.html