AT_codefestival_2016_final_b

根据题意,很容易得知要使得它们的最大值最小,就要从最小的 \(1\) 开始用。转化一下题意,不难发现,我们只需求出最小的 \(k\),使得

\[\ \sum_{i=1}^k i\ \ge n \]

于是思路便产生了:对 \(1\)\(2\)\(3\),⋯\(k\) 求和,直到上述式子成立。可以很容易地看出来一个规律:

\[( \ \sum_{i=1}^k i\ ) - n<k+1 \]

根据这个规律,我们知道多出来的那一部分就存在于 \(1-k\) 当中,所以输出时判断是否为多出来的那个数就可以了。

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int n,t=0,k=0;
	cin>>n;
	for(int i=1;k<n;i++)
		t++,k+=i;
	k=k-n;
	for(int i=1;i<=t;i++)
		if(i!=k)
			cout<<i<<endl;
	return 0;
}
posted @ 2024-01-20 17:26  liyilang2021  阅读(1)  评论(0编辑  收藏  举报