CF-378 B.Semifinals

题目意思:有n个参赛者,他们都须要参加两场半决赛。第一场半决赛的成绩依次是a1a2, ..., an,分别对应第1~第n我的的成绩。第二场则是b1b2, ..., bn。其中这两个序列都是以递增方式排列的。须要从中找出有机会跻身于总决赛的人(标记为1)包括成绩排名前k人(对应成绩是a1,b1;a2,b2,...,ak,bk)和处在两场半决赛的总成绩处在n-2k排名的人。至于k是不肯定的,只知道范围是:0 ≤ 2k ≤ nios

作法:spa

彷佛显然能够证实当k=0时所能上场的人就是肯定了右边界。而后当k取最大值时也就不怎么须要从k名开外的地方选人了,两个边界一叠加,答案就出来了。code

#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100010
using namespace std;
int a[maxn],b[maxn],w[maxn],q[maxn],n;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i],&b[i]);
    int i,j,z;
    i=j=z=1;
    while(z<=n){
        if(a[i]<=b[j]){
            q[i]=1;
            i++;z++;
        }
        else {
            w[j]=1;
            j++;z++;
        }
    }
    for(int i=1;i<=n/2;i++)printf("1");
    for(int i=n/2+1;i<=n;i++)printf("%d",q[i]);
    puts("");
    for(int i=1;i<=n/2;i++)printf("1");
    for(int i=n/2+1;i<=n;i++)printf("%d",w[i]);
    puts("");
    return 0;
}
本站公众号
   欢迎关注本站公众号,获取更多信息