问题描述
题目要求我们找出给定整数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,这样的划分方案就是字典序最小的方案。