**
航电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;
}
#总结
数学题要找规律 别嗯来!!!
博客主要探讨了一道数学问题,即如何找到使得1±2±3±4...±n的和等于给定数m的最小n值。通过分析发现,当序列从全加变为全减时,和的变化为2的倍数,因此关键在于找到m-n为2的倍数的n值。解决方案包括两种思路,一种是使用广度优先搜索,另一种是直接计算和并检查条件。总结强调了解决数学问题时寻找规律的重要性。

被折叠的 条评论
为什么被折叠?



