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;
先做加法再做减法。
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; }
相关文章推荐
- [LeetCode]Jump Game
- 客户对网站知识的了解能促进网站建设行业的发展
- 浅谈网站robots的写法
- [LeetCode]Spiral Matrix
- HDU - 4115 Eliminate the Conflict(2-SAT)
- 设计模式07: Bridge 桥接模式(结构型模式)
- mysql 字段添加唯一性约束
- 磁盘的性能监控
- awk ARGIND内置变量的使用以及comm命令的使用
- asp.net(c#)有关 Session 操作的几个误区
- mysql ERROR 1005
- POJ 1088 滑雪
- SOA理解
- [LeetCode]Maximum Subarray
- FileZilla读取目录列表失败的解决办法 ftp
- sqlplus环境配置
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
- 判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)
- 简历没回音17条原因,你该看看
- Linux文件系统