码迷,mamicode.com
首页 > 其他好文 > 详细

POJ_3579_Median1

时间:2016-04-23 08:58:56      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

描述


http://poj.org/problem?id=3579

给你一串数,共C(n,2)个差值(绝对值),求差值从大到小排序的中值,偶数向下取.

分析


可以先把数排序,然后下界0,上界a[n]-a[1],二分假定中值d,如果所有差值中大于等于d的小于等于N/2,说明d太大了.判断d是否可行时如果枚举差值就太慢了,可以对于每一个数x,找所有满足xi>=x+d(xi>x)的xi的个数,这里还是用二分,直接lower_bound即可.

注意:

1.差值共有N=C(n,2)=n*(n-1)/2而不是n.

2.数据范围并不会超int.

技术分享
 1 #include<cstdio>
 2 #include<algorithm>
 3 using std :: sort;
 4 using std :: lower_bound;
 5 
 6 const int maxn=100005;
 7 int n,N;
 8 int a[maxn];
 9 
10 bool C(int d)
11 {
12     int cnt=0;
13     for(int i=1;i<n;i++) cnt+=a+n-(lower_bound(a+i+1,a+n+1,a[i]+d)-1);
14     return cnt<=N/2;
15 }
16 
17 void solve()
18 {
19     sort(a+1,a+n+1);
20     int l=0,r=a[n]-a[1];
21     while(l<r)
22     {
23         int m=l+(r-l+1)/2;
24         if(C(m)) r=m-1;
25         else l=m;
26     }
27     printf("%d\n",l);
28 }
29 
30 void init()
31 {
32     while(scanf("%llu",&n)==1)
33     {
34         N=n*(n-1)/2;
35         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
36         solve();
37     }
38 }
39 
40 int main()
41 {
42     init();
43     return 0;
44 }
View Code

 

POJ_3579_Median1

标签:

原文地址:http://www.cnblogs.com/Sunnie69/p/5423829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!