整数划分———二分+前缀和

2023-12-15 20:02:42

牛牛有一个整数 n ,他想知道这个数字所有好的划分中字典序最小的划分方案是什么。
一个好的划分是一个正整数序列,序列中所有数字的和等于 n ,且序列中不存在相同的数。

Input
本题采用多组案例输入,第一行一个整数 T 代表案例组数。
每组案例中,输入一行一个整数代表 n (0 < n ≤ 1e6).
保证单个测试点中所有案例 n 的和不超过 1e6.

Output
对于每组案例,输出一行若干个正整数代表划分出字典序最小的序列,整数之间用空格分隔。

输入
3
4
7
10

输出
1 3
1 2 4
1 2 3 4

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int sum[10001];
void find()
{
    for (int i=1;i<=10000;i++) 
    {
        sum[i]=sum[i-1]+i;
    }
}
int t,n;
signed main()
{
    ios;
    find();
    cin>>t;
    while (t--)
    {
        cin>>n;
        int l=1,r=10000;
        while (l<r)
        {
            int mid=l+r>>1;
            if (sum[mid]>n) r=mid;
            else l=mid+1;
        }
        for (int i=1;i<l-1;i++) cout<<i<<" ";
        cout<<n-sum[l-2]<<endl;
    }
    return 0;
}


??

文章来源:https://blog.csdn.net/m0_74403543/article/details/135023557
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。