SSL P2209 数数

来源:互联网 发布:2016网络诈骗案 编辑:程序博客网 时间:2024/05/21 09:39

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.
2 0
原创粉丝点击