| ||||||||||
| 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 | |||||||||
RE.. 不太明白。。请过的朋友给点提示#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int maxn = 20010;
const int maxc = 100010;
int n, nc, all;
struct Cow{int s, a;}ss[maxn], sc[maxn];
int cmp1(const void * a, const void * b)
{
return (*(Cow *)a).s-(*(Cow *)b).s;
}
int cmp2(const void * a, const void * b)
{
return (*(Cow *)a).a-(*(Cow *)b).a;
}
void init()
{
int i;
//initiation
//input
scanf("%d%d%d", &n, &nc, &all);
for(i=0; i<nc; i++)
scanf("%d%d", &ss[i].s, &ss[i].a);
memcpy(sc, ss, nc*sizeof(Cow));
qsort(ss, nc, sizeof(Cow), cmp1);
qsort(sc, nc, sizeof(Cow), cmp2);
//pretreatment
}
void work()
{
int i, j, cnta, cntb, maxi = -1, sum;
int k = n/2;
for(i = k; i<nc-k; i++) //枚举中位数
{
j = cnta = cntb = sum = 0;
while(cnta<k || cntb<k && j<nc) //在以aid值排序的序列中检验是否全加小于F
{
if(sc[j].s<ss[i].s && cnta<k) {cnta++; sum += sc[j].a;}
else if(sc[j].s>ss[i].s && cntb<k) {cntb++; sum += sc[j].a;}
j++;
}
if(cnta>=k && cntb>=k && sum+ss[i].a<=all) maxi = i;
// while(ss[i].s == ss[i+1].s && i<nc-k) i++; //跳过重复
}
if(maxi == -1) printf("-1\n"); //无解的情况
else printf("%d\n", ss[maxi].s);
}
int main()
{
init();
work();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator