UVA668

------------

## 题目大概:
有 $T$ 组数据,每组数据给出一个整数


$N(5 \le N \le 1000)$,要求你将这个整数 $N$ 分解为若干整数和的形式,使这些整数的乘积最大,输出分解后的这些整数。

##### [返回题目](https://www.luogu.com.cn/problem/solution/UVA668)
------------
这道题比较偏数学了,所以想通如何得出正确答案,就可以比较轻松的 AC 了。
先说说解题思路吧:

1. 首先我们要知道,每个大于 $4$ 的数拆分为多个正整数之和,再将这些拆分出的数相乘后,他们的积一定大于原数。
2. 其次,将一个正整数拆分为多个正整数后,拆分出的每个数都比原数小。
3. 所以,我们可以得出结论:拆分数时,应该拆分的越小越好。
4. 但是,我们可以发现:$1$ 和 $0$ 是最最废的东西,一个不会将乘积增多,一个更是会将它“归零”!所以我们枚举是从 $2$ 开始。
5. 但这时,我们发现一个问题:如果剩的值大于数列长度(也就是等于序列最后一个数),我们就要特判了。

比如,当这个整数为 $23$ 时: 

拆分出来的数为: 
$2$、
$3$、
$4$、
$5$、
$6$。

剩余的部分为: 
$3$。

然后将3拆分成 $1+1+1$,分别加入后 $3$ 个,序列为: 
$2$、
$3$、
$5$、
$6$、
$7$。

当然,我们无需再判断最后剩余部分为 $1$ 的情况,因为这时剩余部分就至少能再在数列中添加一个数了。


------------

话不多说,上代码!!!
```cpp
#include<bits/stdc++.h>
using namespace std;
int q;
int main() 
{
    cin>>q;
    while(q--) 
    {
        int n;
        cin>>n;
        int a[1005],c = 0; 
            //设一个比题目大一点点的数,不会爆炸
        for(int i=2;n-i>=0;i++) 
        {
            a[++c]=i;
            n=n-i;
        }
        int k=c;
        while(n) 
        {
            a[k]++;
            k--;
            n--;
        }
        for(int i=1;i<=c;i++)
            cout <<a[i]<<" ";
        cout<<endl;
    }
    return 0;
}
```


------------
###### 蒟蒻的第一篇题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值