Hdu 5334 Virtual Participation (构造)

本文介绍了一种用于解决特定数列问题的算法实现,通过二分查找和递归调用的方法来构造符合要求的数列,并给出了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析:

首先找到第一个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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值