Description
给出n个正整数,请你数出其中有多少对数的和小于等于s。
Input
第1行两个正整数n,s。
第2行n个正整数,表示给出的数。
Output
只有一个数,如题目要求所示。
Sample Input
4 6
3 5 2 1
Sample Output
4
Hint
数据范围
对于50%的数据,n<=1000;
对于100%的数据,n<=100000,给出的数以及s都小于等于1000000。
首先快排,因为排序后为从小到达(升序),所以如果a[j]+a[i]<=s,那就有(j-i)个数+a[i]<=s,根据这个规律直接暴力。
备注:比一般暴力枚举,省时省力省时间
var
a:array [1..100000] of longint;
i,g,n,c,j,ans:longint;
procedure qsort(l,r:longint);
var
i,j,key,temp:longint;
begin
if l>=r then exit;
i:=l;j:=r;
key:=a[(l+r) div 2];
repeat
while (a[i]<key) do inc(i);
while (a[j]>key) do dec(j);
if i<=j then
begin
temp:=a[i];a[i]:=a[j];a[j]:=temp;
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
begin
readln(n,c);
for i:=1 to n do read(a[i]);
qsort(1,n);
ans:=0;
g:=n;
for i:=1 to n-1 do
begin
if a[i]>=c then break;
if g<=i then break;
for j:=g downto i+1 do
if a[i]+a[j]<=c then
begin
ans:=ans+(j-i);
g:=j;
break;
end;
end;
writeln(ans);
end.