hdu5334

比賽時想了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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章