| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
用堆维护前k小的数,左右扫描预处理,枚举中位数的位置#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<fstream>
#include<string>
#include<map>
#include<set>
#include<utility>
#include<queue>
#include<stack>
#include<ctime>
#include<ctype.h>
#include<iomanip>//输出保留精度
#define INF (1<<28)
#define EPS 1e-6
#define PI acos(-1)
#define lowbit(a) ((a) & (-(a)))
#define min(a,b) ((a)<(b) ? (a):(b))
#define max(a,b) ((a)>(b) ? (a):(b))
#define abs(a) ((a)>0?(a):-(a))
#define swp(a,b) {int tem=a; a=b; b=tem;}
#define SET(a,b) memset(a,b,sizeof(a))
using namespace std;
ifstream fin("C-large-practice.in");
//ofstream fout("C-small-practice.out");
typedef unsigned long ull;//2^63
typedef long long ll;//2^62
typedef pair<int, int> P;
const int MAX_N=5000;
const int MAX_M=2100;
const int MAX_V=1000;
const int MAX_E=1000;
const int M=1000000;
int n,m,fsum;
struct nod
{
int c,f;
bool operator<(const nod& x) const
{
return f<x.f;
}
}a[100000];
bool cmp(const nod& x,const nod& y)
{
return x.c<y.c;
}
int minl[100000],minr[100000];
//minl[i]表示i左边前n/2小的数的和
//minr[i]表示i右边前n/2小的数的和
priority_queue<nod> ql,qr;//大顶堆,维护前n/2个最小的数
void solve()
{
int ans=-1,sum1=0,sum2=0;
sort(a,a+m,cmp);
for(int i=0;i<m;i++)
{
if(i<n/2)
{
ql.push(a[i]); sum1+=a[i].f;
continue;
}
minl[i]=sum1;
if(a[i].f>=ql.top().f) continue;
sum1-=ql.top().f;
ql.pop();
sum1+=a[i].f;
ql.push(a[i]);
}
for(int i=m-1;i>=0;i--)
{
if(i>m-1-n/2)
{
qr.push(a[i]); sum2+=a[i].f;
continue;
}
minr[i]=sum2;
if(a[i].f>=qr.top().f) continue;
sum2-=qr.top().f;
qr.pop();
sum2+=a[i].f;
qr.push(a[i]);
}
//枚举中位数的位置,在其左右各选n/2个最小的数
for(int i=m-1-n/2;i>=n/2;i--)
if(minl[i]+minr[i]+a[i].f<=fsum)
{
ans=a[i].c; break;
}
cout<<ans<<endl;
}
int main()
{
cin>>n>>m>>fsum;
for(int i=0;i<m;i++) scanf("%d%d",&a[i].c,&a[i].f);
solve();
system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator