poj2010 Moo University - Financial Aid 二分

原创 2017年01月03日 23:57:39

题意: bessie要给牛建一所学校,他的总资金为F,牛的总数为C,总共可以提供N头牛上学,对于每头牛,已知它的分数和bessie需要提供给它的资金,问如何从C头牛中选择N头牛,在资金不超过F的前提下,使这N头牛的分数的中位数最大

思路:由于结果收到分数和资金的共同影响,所以将牛的分数和个人资金以及下标存在结构体中,分别对分数和资金排序,再二分分数的中位数,不断更新即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,s;
struct Z{
int x;
int y;
int z;
}z1[100005],z2[100005];
bool cmp(Z& a,Z& b){
return a.x<b.x;
}
bool cmp1(Z& a,Z& b){
return a.y<b.y;
}
int main(){
cin>>m>>n>>s;
int ans=-1;
for(int i=0;i<n;i++){
    scanf("%d%d",&z1[i].x,&z1[i].y);
}
sort(z1,z1+n,cmp);
for(int i=0;i<n;i++){
    z1[i].z=z2[i].z=i;
    z2[i].x=z1[i].x;
    z2[i].y=z1[i].y;
}
memcpy(z2, z1, sizeof(Z) * n);
sort(z2,z2+n,cmp1);
int l=0,r=n;
while(r-l>1){
    int mid=(l+r)/2;
     int sum=z1[mid].y;
     int left=0,right=0;
     for(int i=0;i<n;++i){
        if((z2[i].z<mid)&&(sum+z2[i].y<=s)&&(left<m/2)){
            left++;
            sum+=z2[i].y;
        }
        else if((z2[i].z>mid)&&(z2[i].y+sum<=s)&&(right<m/2)){
            sum+=z2[i].y;
            right++;
        }
     }
        if((left<m/2)&&(right<m/2)){
            ans=-1;
            break;
        }
        else if(left<m/2)
               l=mid;
        else if(right<m/2)
              r=mid;
        else {
            ans=z1[mid].x;
            l=mid;
        }
}
 cout<<ans<<endl;
}


POJ 2010 Moo University - Financial Aid (优先队列/二分答案)

题目大意:从c个物品中选出n(奇数)个物品,使得这n个物品的价值中位数尽量高,且总价格不超过f。做法1: 把物品按价值排序 half表示n/2向下取整 low[i]表示前i - 1个物品中价格最小的h...
  • CSDNCJava
  • CSDNCJava
  • 2016年03月06日 16:38
  • 475

《挑战程序设计竞赛》3.1.4 二分搜索-最小化第k大的值 POJ2010 3662(2)

POJ2010http://poj.org/problem?id=2010题意给出n个数,要求将这n个数两两相减,把这些相减得到的数排序后,输出位置在中间的那个数。思路如果两两相减再排序复杂度太高,肯...
  • thudaliangrx
  • thudaliangrx
  • 2015年12月31日 22:54
  • 588

poj2010 二分做法

Moo University - Financial Aid Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 74...
  • csdnicewing
  • csdnicewing
  • 2016年06月12日 20:55
  • 183

二分使第K个数尽量大--poj2010

Language: Default Moo University - Financial Aid Time Limit: 1000MS   Memory Limit: 3...
  • u010660276
  • u010660276
  • 2013年11月22日 22:57
  • 685

POJ 2010(二分最大化中间值)

Moo University - Financial Aid Time Limit: 1000MS   Memory Limit: 30000KB   64bit IO Format: %ll...
  • yjf3151731373
  • yjf3151731373
  • 2016年10月25日 08:30
  • 99

poj2010 Moo University - Financial Aid 二分

题意: bessie要给牛建一所学校,他的总资金为F,牛的总数为C,总共可以提供N头牛上学,对于每头牛,已知它的分数和bessie需要提供给它的资金,问如何从C头牛中选择N头牛,在资金不超过F的前提下...
  • dlutjwh
  • dlutjwh
  • 2017年01月03日 23:57
  • 178

POJ---3685(Matrix,二分搜索)

题意: 给定一个N*N矩阵,其中Aij =i2 +100000 × i + j2 - 100000 × j + i × j。 求矩阵中第K大的数。   题解: 自然的想法还是算出来所有的A...
  • sgh666666
  • sgh666666
  • 2018年02月04日 17:10
  • 19

POJ2010--Moo University-Financial Aid(二分)

题目大意:在C头牛里选N头牛,在不超过经费F的情况下,使得N头牛的得分中位数最大。 分析:首先,既然有两个属性,我们可以分别开两个数组,一个数组按成绩升序,一个数组按经费升序。二分中位数那头...
  • hhhhhhj123
  • hhhhhhj123
  • 2015年08月22日 23:47
  • 479

poj2010 Moo University - Financial Aid

Moo University - Financial Aid 题意:    一个私立学校的学生要申请奖学金,而学校的金额有限。因此,学校希望在金额不超过F的情况下从C中选得N对数。   ...
  • u010016150
  • u010016150
  • 2014年09月18日 10:52
  • 672

BZOJ 2083 [Poi2010]Intelligence test 二分查找

BZOJ 2083 [Poi2010]Intelligence test 暴力
  • wzq_QwQ
  • wzq_QwQ
  • 2015年09月21日 16:34
  • 867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2010 Moo University - Financial Aid 二分
举报原因:
原因补充:

(最多只允许输入30个字)