注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

OI之路,漫漫人生

只为梦想,没有理由

 
 
 

日志

 
 

POJ2010Moo University - Financial Aid题解  

2014-04-12 13:31:11|  分类: POJ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
                                                                 财政补助
                                          BY   LGS
题目大意:给你C头牛,要选N头,每头牛有一个分数和钱数,使得N头牛分数的中位数最大且钱数不超过给定的F。

题解:因为求的是中位数,前面和后面的分数没什么用,而钱数是相关的,类似贪心找最少的钱数,所以可以先按照分数排个序,然后用变量iO(N)扫过去,用堆维护前i-1个中n/2个钱数最小放进堆。后面比i大的也这样就行了

总结:堆+贪心(NlogN)
代码:
  • Source Code
  • #include<cstdio>
    #include<algorithm>
    #define maxn 100001
    #define maxx 999999999
    using namespace std;
    struct node{int t1,t2;}a[maxn];
    int i,j,k,n,b[maxn],c[maxn],nn,f,heap[maxn],size,num,ans;
    bool cmp(const node&a,const node&b){return a.t1<b.t1;}
    void down(int w)
     {
     int t;
     while ((heap[w*2]>heap[w])||(heap[w*2+1]>heap[w]))
               {
               if (heap[w*2]>heap[w*2+1]){t=heap[w];heap[w]=heap[w*2];heap[w*2]=t;w=w*2;}
               else {t=heap[w];heap[w]=heap[w*2+1];heap[w*2+1]=t;w=2*w+1;}
               }
     }
    void up(int w)
     {
     int t;
     while (w>1&&heap[w]>heap[w/2])
     {t=heap[w];heap[w]=heap[w/2];heap[w/2]=t;w/=2;}
     }
    int main()
    {
     scanf("%d%d%d",&n,&nn,&f);
     for (i=1;i<=nn;i++)
        scanf("%d%d",&a[i].t1,&a[i].t2);
    sort(a+1,a+nn+1,cmp);
    size=0;num=0;
    for (i=1;i<=nn;i++){
           if (size<n/2){num+=a[i].t2;heap[++size]=a[i].t2;up(size);}
           else
           if (a[i].t2<heap[1]){num=num-heap[1]+a[i].t2;heap[1]=a[i].t2;down(1);}
           if (size>=n/2) b[i]=num;
                      }
    size=0;num=0;
    for (i=nn;i>=1;i--)
                     {
           if (size<n/2){num+=a[i].t2;heap[++size]=a[i].t2;up(size);}
              else
           if (a[i].t2<heap[1]){num=num-heap[1]+a[i].t2;heap[1]=a[i].t2;down(1);} 
           if (size>=n/2) c[i]=num;             
                     }
    ans=maxx;
    for (i=n/2+1;i<=nn-n/2;i++) if (b[i-1]+c[i+1]+a[i].t2<=f)
                         ans=a[i].t1;
    if (ans==maxx) printf("-1");
     else printf("%d",ans);
    return 0; 
    }



  评论这张
 
阅读(6)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018