| ||||||||||
| 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 | |||||||||
二分答案+判定 nlogn,可以不用堆,附代码Source Code
Problem: 2010 User: yzhw
Memory: 3136K Time: 282MS
Language: G++ Result: Accepted
Source Code
# include <cstdio>
using namespace std;
# include <algorithm>
# include <cstring>
int n,c,f;
struct node
{
int s,c;
int id;
}cows[100005],cowc[100005];
int rank[100005];
bool cmps(node a,node b)
{
return a.s<b.s;
}
bool cmpc(node a,node b)
{
return a.c<b.c;
}
int chk(int pos)
{
int left=0,right=0,tf=f;
bool mid=false;
for(int i=0;i<c;i++)
if(rank[cowc[i].id]<pos&&left<n/2)
if(tf>=cowc[i].c)
left++,tf-=cowc[i].c;
else break;
else if(rank[cowc[i].id]==pos&&!mid)
if(tf>=cowc[i].c)
mid=true,tf-=cowc[i].c;
else break;
else if(rank[cowc[i].id]>pos&&right<n/2)
if(tf>=cowc[i].c)
right++,tf-=cowc[i].c;
else break;
if(left>=n/2&&right>=n/2&&mid) return 0;
else if(left>=n/2) return 1;
else if(right>=n/2) return -1;
else if(left<n/2&&right<n/2) return -2;
}
int main()
{
scanf("%d%d%d",&n,&c,&f);
for(int i=0;i<c;i++)
{
scanf("%d%d",&cows[i].s,&cows[i].c);
cows[i].id=i;
}
memcpy(cowc,cows,sizeof(cows));
sort(cows,cows+c,cmps);
sort(cowc,cowc+c,cmpc);
/* printf("sorted by s\n");
for(int i=0;i<c;i++)
printf("(%d,%d)\n",cows[i].id,cows[i].s);
printf("\n");
printf("sorted by c\n");
for(int i=0;i<c;i++)
printf("(%d,%d)\n",cowc[i].id,cowc[i].c);
printf("\n");*/
int s=n/2,e=c-1-n/2;
for(int i=0;i<c;i++)
rank[cows[i].id]=i;
while(s<=e)
{
int mid=(s+e)/2;
switch(chk(mid))
{
case -1:
s=mid+1;
break;
case 1:
e=mid-1;
break;
case 0:
s=mid+1;
break;
case -2:
printf("-1\n");
return 0;
};
}
if(chk(s-1)==0)
printf("%d\n",cows[s-1].s);
else
printf("-1\n");
// 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