您的位置:首页 > 其它

poj1844+一道数学题思维+广搜超时了

2015-08-11 11:55 218 查看
思路:

先做加法再做减法。

1.求从1开始枚举,求等差数列和si,直到si》=s

2然后往后枚举数列和,并判断(si-s)%2==0是否为偶数

如果是则说明找到结果i.

为什么可以这样计算呢?

因为开始做加法计算,如果存在减号,那么结果只差必然是偶数例如;

S4=1+2+3+4;

S4’=1-2+3+4;

S4-s4’=4;

//广搜超时
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<cmath>
using namespace std;
struct Node
{
int sum;
int num;
};
queue<Node> q;
int S=0;
void BFS()
{
int num=1,i=0;
Node t1,temp1,temp2;
t1.sum=0,t1.num=0;
q.push(t1);
while(!q.empty())
{
temp1=q.front();
temp2=temp1;
q.pop();
if(temp1.sum==S)
{
printf("%d\n",temp1.num);
return;
}
for(i=1;i<=100;i++)
{
if(pow((double)2,(double)i)-2<num&&pow((double)2,(double)i+1)-2>=num)
{
num+=2;
temp1.num+=1;
temp1.sum+=-i;
q.push(temp1);
temp2.num+=1;
temp2.sum+=i;
q.push(temp2);
break;
}
}
}
}
int main()
{
scanf("%d",&S);
BFS();
return 0;
}


//AC代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int S=0,sum=0,i=0;
scanf("%d",&S);
while(sum-S<0||(sum-S)%2==1)
{
i++;
sum+=i;
}
printf("%d\n",i);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: