NOI2018湖北省队集训Day2 T2 string

题面:
这里写图片描述


得分情况
省队集训A掉的第一题。


正解:
长度为k的01串最多可以有(k-1)k/2个满足要求的数对(0,1交错出现),在这个串中每将一段长度为t的子串变成一样的(均为0或1),答案会减小t(t-1)/2,而这个减小的数是可以贪心的,每次减去小于还需要减的数种最大的即可。


代码:
怕后面写错了,我先对小数据打了个表。

#include<bits/stdc++.h>

using namespace std;

int num[45000];

vector<char>STRING(int n)
{
    vector<char>ans;
    int cnt,mark,left1;
    char now;
    if(n==1) { ans.push_back('0');ans.push_back('1'); }
    else if(n==2) { ans.push_back('0');ans.push_back('1');ans.push_back('1'); }
    else if(n==3) { ans.push_back('0');ans.push_back('1');ans.push_back('0'); }
    else if(n==4) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('1'); }
    else if(n==5) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('0'); }
    else if(n==6) { ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1'); }
    else if(n==7) { ans.push_back('0');ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('0'); }
    else if(n==8) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('1');ans.push_back('0'); }
    else if(n==9) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1'); }
    else if(n==10) { ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1');ans.push_back('0'); }
    else if(n==11) { ans.push_back('0');ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('1');ans.push_back('0'); }
    else if(n==12) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('1');ans.push_back('0');ans.push_back('0'); }
    else if(n==13) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('1');ans.push_back('0');ans.push_back('1'); }
    else if(n==14) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1');ans.push_back('0'); }
    else if(n==15) { ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1'); }
    else if(n==16) { ans.push_back('1');ans.push_back('1');ans.push_back('1');ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('1'); }
    else if(n==17) { ans.push_back('1');ans.push_back('1');ans.push_back('1');ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('0'); }
    else if(n==18) { ans.push_back('1');ans.push_back('1');ans.push_back('1');ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1'); }
    else if(n==19) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('1');ans.push_back('0');ans.push_back('1');ans.push_back('0'); }
    else if(n==20) { ans.push_back('0');ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1');ans.push_back('0');ans.push_back('1'); }
    else
    {
        for(int i=2;i<=44800;i++) num[i]=i*(i-1)/2;
        for(int i=2;i<=44800;i++) if(num[i]>=n) { mark=i;break; }
        now='0',cnt=mark,left1=num[mark]-n;
        for(int i=mark-1;i>=2;i--)
        {
            if(left1==0) break;
            while(left1>=num[i])
            {
                for(int j=1;j<=i;j++) ans.push_back(now);
                now-='0';
                now=now^1;
                now+='0';
                cnt-=i;
                left1-=num[i];
            }
        }
        for(int i=1;i<=cnt;i++)
        {
            ans.push_back(now);
            now-='0';
            now=now^1;
            now+='0';
        }
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/qq_39662197/article/details/80424061
T2
今日推荐