poj 2100 Graveyard Design(扫描数组)
2015-07-17 16:01
148 查看
题目链接:
点击打开链接
题目大意:
给出一个数,问有哪些连续的区间的平方和能够得到这个数
题目分析:
定义三个量,l,r,sum
l代表当前的区间的左边界,r代表当前的区间的右边界,sum代表当前维护的区间的和,因为是自然数集中进行操作,所以元素师递增的,所以每次将r向前推进,然后如果当前的sum等于n,那么得到一个解,如果sum>n,因为后面的数添加进来只能导致sum原来越大,所以当前的l已经无解,所以l推进到sum <= n ,然后如果有解的话添加,然后重复上述步骤就可以了
代码如下:
点击打开链接
题目大意:
给出一个数,问有哪些连续的区间的平方和能够得到这个数
题目分析:
定义三个量,l,r,sum
l代表当前的区间的左边界,r代表当前的区间的右边界,sum代表当前维护的区间的和,因为是自然数集中进行操作,所以元素师递增的,所以每次将r向前推进,然后如果当前的sum等于n,那么得到一个解,如果sum>n,因为后面的数添加进来只能导致sum原来越大,所以当前的l已经无解,所以l推进到sum <= n ,然后如果有解的话添加,然后重复上述步骤就可以了
代码如下:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> using namespace std; typedef long long LL; LL n; struct Node { int l,r; Node ( int a , int b ) { l = a; r = b; } bool operator < ( const Node & a ) const { return r-l > a.r - a.l; } }; vector<Node> v; int main ( ) { while ( ~scanf ( "%lld" , &n )) { v.clear(); LL l = 1,r = 0; LL sum = 0; while ( l*l <= n ) { //cout << sum << endl; bool flag = true; // cout << l << " " << r << " " << sum << endl; if ( r*r <= n ) { r++; sum += r*r; if ( sum == n ) { flag = false; //cout << "YES : " << l << " " << r << endl; v.push_back ( Node ( l , r )); } } while ( sum > n ) { sum -= l*l; l++; } if ( sum == n && flag ) { v.push_back ( Node ( l , r ) ); } } sort ( v.begin() , v.end() ); printf ( "%d\n" , v.size() ); for ( int i = 0 ; i < v.size() ; i++ ) { printf ( "%d" , v[i].r - v[i].l+1 ); for ( int j = v[i].l ; j <= v[i].r ; j++ ) printf ( " %d" , j ); puts(""); } } }
相关文章推荐
- 数组作为函数实参时注意
- 插入符
- Html——footer的使用
- RocketMQ原理讲解系列文章
- 【转】搜狗测试经理分享
- 响应式布局框架 Pure-CSS 5.0 示例中文版-中
- 关于Object-C 底层实现self isa 的理解
- StringBuffer的妙用
- linux shell 脚本自动从配置远程ftp服务上下载更新文件
- 收藏网站8
- zabbix通过自动发现功能实现自动识别网络设备接口
- android笔记——点击按钮放大
- 集合中取出列名相同的,并把其他列的值合并成数组
- unity profiler and optimize and compress android Package
- [qemu] versatilepb 支持
- 深入Java核心 Java内存分配原理精讲
- runOnUiThread
- LeetCodeOJ_171_Excel Sheet Column Number
- @Scope("prototype")
- Linux-github 搭建静态博客