找出字典序最小的好划分方案【贪心算法、总结】

整数划分-牛客

问题描述

题目要求我们找出给定整数n的所有好的划分中,字典序最小的划分方案。一个好的划分是一个正整数序列,满足以下条件:

  • 序列中所有数字的和等于n
  • 序列中不存在相同的数

解决思路

我们可以使用贪心算法来解决这个问题。我们希望找到字典序最小的划分方案,因此我们可以尽量使得划分的数字从小到大排列。具体的解决思路如下:

1.定义一个变量sum,用于记录当前划分方案中数字的和。
2.从1开始遍历到n,依次将数字添加到划分方案中。
3.每次添加数字i时,将sum加上i,并判断sum是否大于等于n - i

  • 如果sum大于等于n - i,说明添加数字i后,划分方案的数字总和已经大于等于n了。那么我们只需要输出n - sum + i即可,这是字典序最小的划分方案。
  • 如果sum小于n - i,说明我们可以继续添加数字i到划分方案中,并将i输出。

4.继续循环,直到遍历完1到n的所有数字。

AC代码

#include<bits/stdc++.h>

using namespace std;

int main() {
    
    
    int t;
    cin >> t;
    
    while (t--) {
    
    
        int n;
        cin >> n;
        
        int sum = 0;
        for (int i = 1; i <= n; i++) {
    
    
            sum += i;
            
            if (sum >= n - i) {
    
    
                cout << n - sum + i << endl;
                break;
            } else {
    
    
                cout << i << " ";
            }
        }
    }
    
    return 0;
}

问题一:为什么判断sum大于等于n - i就说明划分方案已找到所有数字?
如果sum + i大于或等于n,那么添加数字i后,划分方案的数字总和已经大于等于n了,没有必要再继续添加更大的数字。此时,我们只需要输出n - sum + i,这样的划分方案就是字典序最小的方案。

猜你喜欢

转载自blog.csdn.net/qq_22841387/article/details/131253490