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
【分析】 思维!很重要很重要!!ε=(´ο`*)))唉
- 首先,k是正数还是负数是没有关系的。比如:-1+2+3=4 和 -(-1+2+3)=-4 是一样的。所以,正负无所谓,负数的话变成整数就好了!
- 然后,自己写写例子之后分析,首先问题是求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;
}