tyvj1979 计算概率
小明有n个长度不一的小木棍,这些木棍的长度都是正整数。小明的父亲想和小明做一个游戏。他规定一个整数长度l,让小明闭着眼睛从n个木棍中随便拿出两个。如果两个木棍的长度总和小于等于l,则小明胜,否则小明的父亲胜。小明想知道他胜出的概率究竟有多大。
输入格式 Input Format
输入包含两行。第一行为两个整数n和l。第二行包含n个整数,分别为n个木棍的长度。
输出格式 Output Format
输出包含一个实数,小明胜出的概率,保留两位小数。
样例输入 Sample Input [复制数据]4 5
1 2 3 4样例输出 Sample Output [复制数据]0.67
时间限制 Time Limitation
各个测试点1s
注释 Hint
n和l都不超过100000
题解:简单的快排加二分 模拟会TLE
Delphi语言: 高亮代码由发芽网提供
program zqp2;
var a:array[1..100000] of longint;
n,m:int64;mid,l,r,i,j:longint;tot:extended;
procedure qsort(head,tail:longint);
var i,j,x:longint;
begin
i:=head;j:=tail;x:=a[i];
while i<j do begin
while (i<j) and (a[j]>=x) do dec(j);
a[i]:=a[j];
while (i<j) and (a[i]<=x) do inc(i);
a[j]:=a[i];
end;
a[i]:=x;
if head<i-1 then qsort(head,i-1);
if tail>i+1 then qsort(i+1,tail);
end;
begin
readln(n,m);
tot:=0;
for i:=1 to n do read(a[i]);
qsort(1,n);
for i:=1 to n-1 do begin
l:=i+1;r:=n;
while (l<=r) do begin
mid:=(l+r) div 2;
if a[mid]+a[i]=m then break;
if a[mid]+a[i]>m then r:=mid-1;
if a[mid]+a[i]<m then l:=mid+1;
end;
mid:=(l+r) div 2;
tot:=tot+mid-i;
end;
tot:=tot*2/((n-1)*n);
writeln(tot:0:2);
end.