**
航电oj:Sum
**
#题目描述
#题目好难理解 现在有n个数1~n 在式子1±2±3±4 ~ ± n 中这个n最小为多少时可以得到m (题给的那个数)
#数学题 不能想得太复杂了 假设全是加 看值大于m没 只有大于或等于才有可能满足条件 大于就将前面的加号部分改为减号 从加到减 数值变化了两倍 为二的倍数 找到了m - n 为二的倍数就可以满足 计算的值刚好为m
#知识点
数学
#代码
错误例子
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int S;
int INF = 0x3f3f3f3f;
int data[100001];
int ans[100001];
void bfs()
{
memset(data,0,sizeof(data));
//memset(ans,0,sizeof(ans));
data[1] = 1;
ans[1] =1;
int temp1,temp2;
for(int i=2; i<=10000; i++) //遍历的序数 激活级数
{
for(int j=1; j<=100000; j++) //找已经激活的
{
if(data[j] == i-1)//以上一级激活为基础
{
temp1 = data[j] + i;
temp2 = data[j] - i;
if(temp1 >0&&data[temp1]==0)//不为负数的同时 没有赋过值 前面赋值的肯定小
{
data[temp1] = i;
}
if(temp2 >0&&data[temp2]==0)//不为负数的同时 没有赋过值 前面赋值的肯定小
{
data[temp1] = i;
}
}
}
}
}
int main()
{
memset(ans,INF,sizeof(ans));
memset(data,0,sizeof(data));
bfs();
while(scanf("%d",&S)!=EOF)
{
printf("%d\n",data[S]);
}
return 0;
}
///这我开始写的 想的多了 想复杂了
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,sum;
i =1;sum =1;
for(i=2;;i++)
{
sum+= i;
if(sum == n)
{
printf("%d\n",i);
}
if( sum > n)
{
int temp = sum -n;
if(temp%2 == 0)
{
printf("%d\n",i);
break;
}
}
}
}
return 0;
}
#总结
数学题要找规律 别嗯来!!!