BAPC 2014 Preliminary Talent Selection

 1 //在喜欢的里面取mid个,在不喜欢的里面取s-mid个。
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 int T;
 8 const int N=1e5+9;
 9 int t[N],p[N];
10 int main()
11 {
12     int i,j,l,r,mid,maxx,n,s,f,k;
13     scanf("%d",&T);
14     while(T--)
15     {
16     scanf("%d%d%d",&n,&s,&f);
17     for( i=0;i<n;i++)
18     scanf("%d",&t[i]);
19     sort(t,t+f);//要分别排序
20     //因为分成喜欢与不喜欢
21     sort(t+f,t+n);
22     scanf("%d",&k);
23     for(i=0;i<k;i++)
24     scanf("%d",&p[i]);
25     l=max(0,s-(n-f));//下界
26     r=min(s,f);//上界
27     while(l<=r)//因为上界可能取到
28    {
29        mid=(l+r)>>1;
30        maxx=t[n-(s-mid)-1];//不喜欢的不取的最大值
31        for(i=0;i<k-f-(s-mid);i++)//把P数组小的加到不喜欢的不取的小的部分
32            maxx=max(maxx,p[i]+t[k-1-(s-mid)-i]);
33        for(j=0;j<mid&&t[f-1-j]+(k-mid+j<0?0:p[k-mid+j])>=maxx;j++);
34        //喜欢中所取的所有值都要大于不喜欢中不取的最大值
35        if(j==mid)//这个mid是可以的
36            l=mid+1;
37        else
38            r=mid-1;
39    }
40    printf("%d\n",l-1);
41        
42     }
43     return    0;
44 }

猜你喜欢

转载自www.cnblogs.com/tingtin/p/9286356.html