题面:
得分情况
省队集训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;
}