注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
春节来了~房教带着一帮912的ACMer去参加服装节,但是不幸的是,房教只有一块布。这块布长度为S(1<=S<=1,000,000)只能做两件衣服。912一共有N位ACMer,编号为1..N;ACMer i的身高为Li(1<=Li<=1,000,000)。两位ACMer能共用这块布只有当他们的身高之和不大于这块布的长度。房教想知道有多少对ACMer能够满足这块布。
Input
多组数据测试 每组数据第一行:两个整数:N和S,后面N行,第i+1行包含一个整数Li,N不大于20000
输入最后是两个0,0,表示输入结束。这组数据不做处理
Output
每组数据一行,一个整数表示有多少对ACMer能满足条件。注意两个ACMer的顺序没有关系。
Sample Input
4 6
3
5
2
1
0 0
Sample Output
4
Source
注意时间的限制
#include <iostream>
using namespace std;
int cmp(const void *a, const void *b) { return *((long*)a) - *((long*)b); }
int main()
{
long L[20020];
long S, N, n, count;
cin >> N >> S;
while (N || S)
{
count = 0;
n = 0;
for (long i = 1, tall; i <= N; i++)
{
cin >> tall;
if (tall < S)
{
L[n] = tall;
n++;
}
}
if (n < 2)
{
cout << "0" << endl;
}
else
{
qsort(L, n, sizeof(long), cmp);
long half, end;
end = n - 1;
for (long i = 0; i < n; i++)
if (L[i] > S/2)
{
half = i;
break;
}
count = (half * (half - 1)) / 2;
for (long i = 0; i < half; i++)
for (long j = end; j >= half; j--)
if (L[i] + L[j] <= S)
{
count += j - half + 1;
end = j;
break;
}
cout << count << endl;
}
cin >> N >> S;
}
}