比赛时想了3小时,到4点有了思路,结果当时体力不够,思维不够严谨,一直wa。网上看大神题解后,发现大神的思维不是我等渣渣能想出来的,故此又重新拾起自己的思维,ac。
遇到这种题目,大家一定要想,这种题目一定是有规律的,大家要善于发现规律。对此题,我一开始是枚举前10几个数,结果到第4的时候发现,4只能由1111这种四个一样数才能得出,故此思考数列中有相同的数会使子串个数减少某些固定的数。后来发现,连续两个连续的数会使总数减少1,连续3个减少3,连续4个减少6.
#include <iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int k;
int get_n()
{
int n=sqrt(2*k);
if(n*(n+1)<2*k)
n++;
return n;
}
int main()
{
int i,j;
while(~scanf("%d",&k))
{
if(k<=100)
{
printf("%d\n",k);
for(i=1;i<=k;i++)
printf("1 ");
printf("\n");
continue;
}
int n=get_n();
int d=n*(n+1)/2-k,a=d/3,b=d-a*3,f=a/2,f1=a-f*2,len=0;
printf("%d\n",n);
for(i=1;i<=f;i++)
{
len+=4;
printf("%d %d %d %d ",i,i,i,i);
}
for(i=f+1;i<=f+f1;i++)
{
len+=3;
printf("%d %d %d ",i,i,i);
}
for(i=f+f1+1;i<=f+f1+b;i++)
{
len+=2;
printf("%d %d ",i,i);
}
for(i=len+1;i<=n;i++)
printf("%d ",i);
printf("\n");
}
return 0;
}