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;
}
本站公眾號
   歡迎關注本站公眾號,獲取更多信息