LA4726(数形结合 & 单调队列)
来源:互联网 发布:手机淘宝网店怎么装修 编辑:程序博客网 时间:2024/06/06 08:27
题目大意:
给出一串数字,求出不小于长度L的平均值最大的序列,如果平均值一样大的话,让序列尽量的短。
思路:
参考:浅谈数形结合思想在信息学竞赛中的应用
平均值 ave(i,j) = sum[j] - sum[i - 1]/(j - i + 1),所以相当于求j到i的斜率。
斜率越大平均值就越大。
代码:
#include <iostream>using namespace std;#include <queue>#include <cstring>#include <stdio.h>const int maxn = 10e5 + 10;char str[maxn];int q[maxn],sum[maxn];double dis(int a,int b) { return (sum[b] - sum[a])*1.0/(b - a);}int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d %d",&n,&m); scanf("%s",str + 1); sum[0] = 0; for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + str[i] - '0'; int ansl = 0; int ansr = m; double ans = dis(0,m); int front = 0, rear = -1,length = m; for(int i = m; i <= n; i++) { int a = i - m; while(front < rear && dis(a,q[rear]) <= dis(a,q[rear - 1]))//如果后面的值到a的斜率比前面的值到a的斜率还要小的话就剔除掉 rear--; q[++rear] = a; while(front < rear && dis(q[front],i) <= dis(q[front + 1],i))//如果前面的值到i的斜率比后面的值到i的斜率还要小的话也要剔除掉 front++; double b = dis(q[front],i); if(b > ans) { ans = b; ansl = q[front]; ansr = i; length = i - q[front]; } else if(b == ans && length > i - q[front]) { ansl = q[front]; ansr = i; length = i - q[front]; } } printf("%d %d\n",ansl + 1,ansr); } return 0;}
0 0
- LA4726(数形结合 & 单调队列)
- 数形结合、单调队列+uva1451
- 【LA4726】Average【斜率优化】【单调队列】
- UVA 1451 Average 数形结合+单调队列 *
- la4276(*数形结合,单调队列求点集斜率极值)
- UVaLive LA 4726 UVa 1451 - Average (子序列最大平均数 数形结合 斜率优化 单调队列)
- bzoj 1012 最大数(线段树|单调队列|单调栈)
- 20170806(单调栈和单调队列 蛇形填数)
- Openjudge2729 Blah数集(单调队列)
- BZOJ 1012 最大数maxnumber 单调队列
- 【单调队列】1012: [JSOI2008]最大数maxnumber
- POJ 2008 优先队列 好题 数形结合
- 单调栈 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 文章标题
- 小波变换理论讲解
- 第三次上机实践项目-项目1-最大公约数
- 解决double和float精度不准的问题
- 树1——树的同构
- LA4726(数形结合 & 单调队列)
- POJ 2230 Watchcow (欧拉回路)
- 顺序表的初始化(常见用法)
- java文件的读写
- 树2——List Leaves
- Ubuntu系统中安装RPM格式包的方法
- while(1) 什么意思 while(i--)什么意思?
- JavaWeb开发之六:HttpServletRequest对象
- 如何把数据从网页中直接导入到excel中