Hdu 5334 Virtual Participation (构造)

来源:互联网 发布:广电网络个人工作总结 编辑:程序博客网 时间:2024/06/04 20:50

解析:

首先找到第一个n使得n*(n+1)/2>=k,差值为x。

然后看下面一个例子:

28 = 1 2 3 4 5 6 7

27 = 1 1 3 4 5 6 7

26 = 1 1 3 3 4 5 6

25 = 1 1 1 4 5 6 7

24 = 1 1 1 4 4 6 7

23 = 1 1 1 4 4 6 6

22 = 1 1 1 4 4 4 7

21 = 1 2 3 4 5 6

对于x,不断找<=x的最大的m*(m+1)-m,相见进行迭代至0。

注意4是特例。


[code]:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 1e5+5;int m,a[maxn],n;int bin(int x){    int lb,rb,mid;    lb = 0,rb = n+1;    while(rb-lb>1){        mid = (lb+rb)>>1;        if(mid*(mid+1)/2-mid<=x) lb = mid;        else rb = mid;    }    return lb;}void sol(int p,int s){    if(s == 0) return;    int i,l = bin(s);    for(i = 1;i < l;i++){        a[p+i] = a[p];    }    sol(p+l,s-l*(l+1)/2+l);}int main(){    int i,j;    while(~scanf("%d",&m)){        if(m <= 1e5){            printf("%d\n",m);            for(i = 1;i <= m;i++){                if(i-1) putchar(' ');                putchar('1');            }            putchar('\n');            continue;        }        for(n = 1;;n++){            a[n] = n;            if(n*(n+1)/2>=m) break;        }        sol(1,n*(n+1)/2-m);        printf("%d\n",n);        for(i = 1;i <= n;i++){            if(i-1) putchar(' ');            printf("%d",a[i]);        }        putchar('\n');    }    return 0;}



0 0
原创粉丝点击