zcmu 1120 前n项和(思维!)

1120: 前n项和

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 265  Solved: 121
[Submit][Status][Web Board]

Description

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

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

Input

多组测试数据。

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

Output

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

Sample Input

12

Sample Output

7

HINT

Source

【分析】 思维!很重要很重要!!ε=(´ο`*)))唉

  1. 首先,k是正数还是负数是没有关系的。比如:-1+2+3=4   和  -(-1+2+3)=-4 是一样的。所以,正负无所谓,负数的话变成整数就好了!
  2. 然后,自己写写例子之后分析,首先问题是求1~i的和记为sum,如果将1~i这一序列中的某个数变成负数,那么结果是减2倍的这个数。不需要再额外增加序列长度,即扩展i。所以,只要讨论sum-k是奇数的情况。如果是奇数,就i++,直到差值变成偶数为止!YES!这是个思维题!

【代码】丑丑的代码

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
	int k;
	while(~scanf("%d",&k))
	{
		int sum=0,i=0;
		if(k==0)
		{
			cout<<"3\n";
			continue;
		}
		k=abs(k);
		while(sum<k)
		{
			i++;
			sum+=i;
		}
		if(sum==k)cout<<i<<endl;
		else
		{
			int x=sum-k;
			while(x&1)
			{
				i++;
				sum+=i;
				x=sum-k;
			}
			cout<<i<<endl;	
		}
	}
	return 0;
}

【代码】被指点改过的超简洁的代码hiahiahia

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
	int k;
	while(~scanf("%d",&k))
	{
		int i=0,sum=0;
		k=abs(k);
		while(++i)
		{
			sum+=i;
			if(sum>=k&&(sum-k)%2==0)
			{
				cout<<i<<endl;
				break;
			}
		}	
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/82934544