当前位置: 代码迷 >> 综合 >> OJ 1044 前n项和
  详细解决方案

OJ 1044 前n项和

热度:24   发布时间:2024-02-05 16:28:21.0

描述

有一个序列,?1?2?3…?n=k,?的地方不是’+’就是’-’,你的任务是给定一个整数k,求出最小的n满足上述条件。例如当k=12是,n为7。

- 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12


输入
多组测试数据。

每组测试数据包含1个整数k。(|k|<=10000)


输出
对于每组测试数据,输出最小的n.


输入样例 1

12
输出样例 1

7

题目要求找出最短的序列(最小的n),那么n最小的时候当然是全部都是‘+’的时候了,但是全为‘+’的话很多数字都无法达成,所以又需要‘-’,假设对于12全‘+’的话到1+2+3+4时小于12但是1+2+3+4+5时大于12,如果将其中任何一项改为‘-’都需要记减去其中一项的两倍,也就是说多出来的部分应该是二的倍数,所以将其从一开始累加,让累加的数字大于预定值时,判断多余的数据是否为2的倍数即可得到最小的n。

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;int main()
{int n;while(cin>>n){n=abs(n);int sum=0;for(int i=1; i<20000; i++){sum+=i;if(sum==n){cout<<i<<endl;break;}else if(sum>n&&(sum-n)%2==0){cout<<i<<endl;break;}}}return 0;
}