尺取法 poj 2566
尺取法:顾名思义就是像尺子一样一段一段去取,保存每次的选取区间的左右端点。然后一直推进
解决问题的思路:
- 先移动右端点 ,右端点推进的时候一般是加
- 然后推进左端点,左端点一般是减
poj 2566
题意:从数列中找出连续序列,使得和的绝对值与目标数之差最小
思路:
- 在原来的数列开头添加一个0
- 每次找到的区间为 [min(i,j)+1,max(i,j)]
应用尺取法的代码:
- while (r <=n)
- {
- int sub = pre[r].sum - pre[l].sum;
- while (abs(sub - t) < Min)
- {
- Min = abs(sub - t);
- ansl= min(pre[l].id, pre[r].id) + ;
- ansr = max(pre[l].id, pre[r].id);
- ans = sub;
- }
- if (sub < t)
- r++;
- else if (sub > t) l++;
- else break;
- if (l == r) r++;
- }
解决问题的代码:
- #include <iostream>
- #include <stdio.h>
- #include <algorithm>
- #include <math.h>
- #include <cstring>
- #include <vector>
- #include <queue>
- using namespace std;
- const int N = 1e5 + ;
- const int INF = 0x7fffffff;
- int n, k;
- int a[N];
- struct node {
- int sum, id;
- }pre[N];
- bool cmp(node a, node b)
- {
- return a.sum < b.sum;
- }
- int main()
- {
- while (scanf("%d%d", &n, &k) != EOF)
- {
- if (n == && k == ) break;
- pre[].id = , pre[].sum = ;
- for (int i = ; i <= n; i++)
- {
- scanf("%d", &a[i]);
- pre[i].id = i;
- pre[i].sum = pre[i - ].sum + a[i];
- }
- sort(pre, pre + n + , cmp);
- for (int i = ; i < k; i++)
- {
- int t;
- scanf("%d", &t);
- int Min = INF;
- int l = , r = ;
- int ans, ansl, ansr;
- while (r <=n)
- {
- int sub = pre[r].sum - pre[l].sum;
- while (abs(sub - t) < Min)
- {
- Min = abs(sub - t);
- ansl= min(pre[l].id, pre[r].id) + ;
- ansr = max(pre[l].id, pre[r].id);
- ans = sub;
- }
- if (sub < t)
- r++;
- else if (sub > t) l++;
- else break;
- if (l == r) r++;
- }
- printf("%d %d %d\n", ans, ansl, ansr);
- }
- }
- return ;
- }
poj 2739
题意:将一个整数分解为连续的素数之和,有多少种分法?
思路:
- 打表,先打出素数表
- 然后依次查询是否满足条件
用尺取法的代码:
- for (;;) {
- while (r < size&&sum < n)
- {
- sum += primes[r++];
- }
- if (sum < n) break;
- else if (sum == n) result++;
- sum -= primes[l++];
- }
解决问题的代码:
- #include <iostream>
- #include <stdio.h>
- #include <algorithm>
- #include <math.h>
- #include <cstring>
- #include <vector>
- #include <queue>
- using namespace std;
- #define maxn 10000+16
- vector<int> primes;
- vector<bool> is_prime;
- void init_prime()
- {
- is_prime = vector<bool>(maxn + , true);
- is_prime[] = is_prime[] = false;
- for (int i = ; i < maxn; i++)
- {
- if (is_prime[i])
- {
- primes.push_back(i);
- for (int j = i * ; j < maxn; j += i)
- {
- is_prime[j] = false;
- }
- }
- }
- }
- int main()
- {
- int n;
- init_prime();
- int size = primes.size();
- while (cin >> n && n)
- {
- int result = , sum = ;
- int l = ,r = ;
- for (;;) {
- while (r < size&&sum < n)
- {
- sum += primes[r++];
- }
- if (sum < n) break;
- else if (sum == n) result++;
- sum -= primes[l++];
- }
- printf("%d\n", result);
- }
- return ;
- }
poj 2100
题意:将一个整数分解为连续数平方之和,有多少种分法?
解决问题的思路:
- 右端点移动,sum+=r*r;
- 如果满足答案就 push (l,r)
- 左端点移动 sum-=l*l;
用尺取法的代码:
- for (;;)
- {
- while (sum < n)
- {
- sq = r * r;
- sum += sq;
- r++;
- }
- if (sq > n) break;
- else if (sum == n) ans.push_back(make_pair(l, r));
- sum -= l * l;
- l++;
- }
解决问题的代码:
- #include <iostream>
- #include <stdio.h>
- #include <algorithm>
- #include <math.h>
- #include <cstring>
- #include <vector>
- #include <queue>
- using namespace std;
- typedef long long ll;
- vector<pair<ll, ll>> ans;
- void solve(ll n)
- {
- ll l = , r = , sum = , sq;
- for (;;)
- {
- while (sum < n)
- {
- sq = r * r;
- sum += sq;
- r++;
- }
- if (sq > n) break;
- else if (sum == n) ans.push_back(make_pair(l, r));
- sum -= l * l;
- l++;
- }
- ll size = ans.size();
- printf("%lld\n", size);
- for (ll i = ; i < size; i++)
- {
- ll ansr = ans[i].second;
- ll ansl = ans[i].first;
- printf("%lld",ansr-ansl);
- for (ll j=ansl;j<ansr;j++)
- printf(" %lld", j);
- printf("\n");
- }
- }
- int main()
- {
- ll n;
- while (scanf("%lld", &n) != EOF)
- {
- if (n == ) break;
- solve(n);
- }
- return ;
- }
尺取法 poj 2566的更多相关文章
- 尺取法 POJ 3320 Jessica's Reading Problem
题目传送门 /* 尺取法:先求出不同知识点的总个数tot,然后以获得知识点的个数作为界限, 更新最小值 */ #include <cstdio> #include <cmath> ...
- 尺取法 POJ 3601 Subsequence
题目传送门 /* 题意:求连续子序列的和不小于s的长度的最小值 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 1. 记录前i项的总和,求[i, p)长度的最小值,用二分找到sum[p] ...
- POJ 3061 Subsequence 尺取法 POJ 3320 Jessica's Reading Problem map+set+尺取法
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13955 Accepted: 5896 Desc ...
- 尺取法 || POJ 2739 Sum of Consecutive Prime Numbers
给一个数 写成连续质数的和的形式,能写出多少种 *解法:先筛质数 然后尺取法 **尺取法:固定区间左.右端点为0,如果区间和比目标值大则右移左端点,比目标值小则右移右端点 ...
- poj 2566 Bound Found(尺取法 好题)
Description Signals of most probably extra-terrestrial origin have been received and digitalized by ...
- poj 2566"Bound Found"(尺取法)
传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...
- POJ 2566 Bound Found(尺取法,前缀和)
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5207 Accepted: 1667 Spe ...
- poj 2566 Bound Found 尺取法 变形
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2277 Accepted: 703 Spec ...
- POJ 尺取法
poj3061 Subsequence 题目链接: http://poj.org/problem?id=3061 挑战P146.题意:给定长度为n的数列整数a0,a1,...,a(n-1)以及整数S, ...
随机推荐
- Android's Media
MediaService.Main #include <sys/types.h> #include <unistd.h> #include <grp.h> #inc ...
- 部分易被忽视的css3属性
1.-webkit-tap-highlight-color 移动端页面点击按钮时会发现按钮上会出现一块阴影,设置-webkit-tap-highlight-color:rgba(0,0,0,0);就可 ...
- open ssh 常用的东西
清除已经存在的但是不同设备的连接信息 ssh-keygen -f "/users/he/.ssh/known_hosts" -R 192.168.1.118 无密码登录openss ...
- hibernate 模拟实现和What is and Why O/R Mapping
What is and Why O/R Mapping What is : 用面向对象的方式调用api,类库帮我们翻译成面向关系的方式. Why: 1.JDBC操作数据库很繁琐2.Sql 语句编写并不 ...
- java之Socket传递图片
客户端: package client; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...
- Eclipse下JRebel的安装和基本使用
JRebel有什么用? 做Java Web开发,一个很头疼的事情是,修改了一个类以后,Tomcat必须重新启动. 工程规模小还好说,如果规模大了,重启一次动不动就是一分多钟.那么频繁重启就会导致大量的 ...
- K星异客
http://baike.baidu.com/view/222058.htm 这部改编自基恩·布汝尔1995年出版的同名小说的电影在当年的十月档票房榜上称冠.本来这部电影的外星人主人公属意于威尔.史密 ...
- Python基础学习之语句和语法
语句和语法 python语句中有一些基本规则和特殊字符: 井号键“#”表示之后的字符为python注释: 三引号(‘‘‘ ’’’)可以多行注释 换行“\n”是标准的行分隔符(通常一个语句一行): 反斜 ...
- JavaScript 常用的Math对象
Math.ceil(x); //返回x向上取整后的整数值. Math.floor(x); //返回x向下取整后的整数值.. Math.round(x); //返回四舍五入后的整数. Math.abs( ...
- COGS 2091. Asm.Def的打击序列
★★★ 输入文件:asm_lis.in 输出文件:asm_lis.out 简单对比时间限制:4 s 内存限制:256 MB [题目描述] 白色圆柱形的“蓝翔”号在虚空中逐渐变大,一声沉 ...