上善若水

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  2 Posts :: 32 Stories :: 2 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

最新随笔

搜索

  •  

积分与排名

  • 积分 - 10174
  • 排名 - 1166

最新评论

阅读排行榜

评论排行榜

小明木棍

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:1746            测试通过:45

描述

小明有n个长度不一的小木棍,这些木棍的长度都是正整数。小明的父亲想和小明做一个游戏。他规定一个整数长度l,让小明闭着眼睛从n个木棍中随便拿出两个。如果两个木棍的长度总和小于等于l,则小明胜,否则小明的父亲胜。小明想知道他胜出的概率究竟有多大。

 

 

输入

输入包含两行。第一行为两个整数n和l,其中n和l都不超过100000。第二行包含n个整数,分别为n个木棍的长度。

 

输出

输出包含一个实数,小明胜出的概率,保留两位小数。

样例输入

4 5
1 2 3 4

样例输出

0.67

提示

 

 

题目来源

NUAA

分析:这道题比较恶心,感觉,因为其实题意并不难理解,不过用到了快速排序和变形的二分查找。未完待续。
#include <stdio.h>
#include 
<stdlib.h>
#define MAXN 100000
int a[3]={0},b[MAXN]={0};
int counts=0,l;
int Comp(const void *p1,const void *p2 )

{

return *((int *)p1) - *((int *)p2);

}
int  binsrch( int n,int k){
    
int low,high,mid,s=-1;
    low
=0;high=n;
    
if (k<b[0])
    {
        
return 0;
    }
else if (k>b[n-1])
    {
        
return n-1;
    }
    
while (low<=high){
        mid
=(low+high)/2;
        
if (k>b[mid])
        {
            low
=mid+1;
            
if (b[low]>k)
            {
                
return low-1;
            }
        }
        
else if (k<b[mid])
        {
            high
=mid-1;
            
if (b[high]<k)
            {
                
return high; 
            }
        }
        
else if (k==b[mid])
        {
            
return mid;
        }
    }
}
int main()
{
    
int m,r,i,j;
    
float q;
    scanf(
"%d",&m);
    scanf(
"%d",&l);
    
for (i=0;i<m;i++)
    {
        scanf(
"%d",&b[i]);
    }
    qsort(b,m,
sizeof(int),Comp);
    
for (i=0;i<m-1;i++)
    {
        j
=binsrch(m,l-b[i]);
        
if (i>=j)
        {
            
break;
        }
        
else
        {
            counts
+=j-i;
        }

    }
    printf(
"%.2f\n",(float)counts*2/m/(m-1));
}
posted on 2009-12-03 17:34 上善若水 阅读(672) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理