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
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.

posted on 2012-10-06 03:08  馒头~blue  阅读(228)  评论(0编辑  收藏  举报

导航