poj2010

//一开始我是想dfs的方法,结果错了。

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
using namespace std;


priority_queue<pair<int,int> > a,b;
pair<int,int> p,q;
int n,c,f,num2;


bool solve(int num1){
if(num1 == n&&num2 <= f){
for(int i = 1;i<=n/2;++i)
b.pop();
cout<<b.top().first<<endl;
return true;
}
while(a.size() + num1>= n){
if(num2 + a.top().second <= f){
q = a.top();
b.push(a.top());
num2 += a.top().second;
a.pop();
if(solve(++num1))
return true;
b.pop();
num2 -= a.top().second;
a.push(q);
}
a.pop();
}
return false;
}


int main(){
scanf("%d%d%d",&n,&c,&f);
for(int i = 0;i<c;++i){
scanf("%d%d",&p.first,&p.second);
a.push(p);
}
num2 = 0;
    if(!solve(0))
    cout<<"-1\n";
    return 0;

}


//真确的


#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
 
struct p{
int x;
int y;
int left;
int right;
}e[100000+5]; 


bool cmp(p a,p b){
return a.x < b.x;
}


int n,c,f;


int main(){
memset(e,0,sizeof(e));
scanf("%d%d%d",&n,&c,&f);
priority_queue<int> q;
for(int i = 1;i<=c;++i)
scanf("%d%d",&e[i].x,&e[i].y);
sort(e+1,e+1+c,cmp);
int p,t,sum = 0;
for(int i = 1;i<=n/2;++i){
p = e[i].y;
q.push(p);
sum += p;
}
for(int i=n/2+1;i<=c-n/2;i++)  
        {  
            e[i].left=sum;            //比这个学生低分的n/2个学生的助学金最小和。  
            p=q.top();  
            t=e[i].y;  
            if(t<p){  
                q.pop();  
                q.push(t);  
                sum=sum-p+t;   
            }  
        }  
while(q.size()) q.pop();
sum = 0;
for(int i = c;i >= c - n/2 + 1;--i){
p = e[i].y;
   q.push(p);
   sum += p;
}
for(int i=c-n/2;i>=n/2+1;i--)  
        {  
            e[i].right=sum;       //比这个学生高分的n/2个学生的助学金最小和。  
            p=q.top();  
            t=e[i].y;  
            if(t<p){  
                q.pop();  
                q.push(t);  
                sum=sum-p+t;  
            }  
        } 
int ans = 0;
for(int i = c-n/2;i>=n/2+1;--i){
if(e[i].left + e[i].y + e[i].right <= f){
ans = e[i].x;
break;

}
if(ans)
cout<<ans<<endl;
else
cout<<"-1\n";
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值