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 @   liyilang2021  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示