題目意思:有n個參賽者,他們都須要參加兩場半決賽。第一場半決賽的成績依次是a1, a2, ..., an,分別對應第1~第n我的的成績。第二場則是b1, b2, ..., 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; }