https://vjudge.net/problem/UVA-1451

题意:给定长度为n的01串,选一个长度至少为L的连续子串,使得子串中数字的平均值最大。

思路:这题需要数形结合,真的是很灵活。

入门经典上讲得很详细,或者也可以看看这个,写得很不错。浅谈树形结合思想在信息竞赛中的应用

这道题的话首先就是求前缀和,之后的平均值就相当于求斜率了。

最重要的一点,就是在用单调队列维护的时候,一定要删去上凸点。

 #include<iostream>
#include<algorithm>
using namespace std; const int maxn = + ; char str[maxn];
int n, L;
int sum[maxn];
int q[maxn];
int front, rear; double cacl(int a, int b) //计算斜率
{
return (double)(sum[b]-sum[a]) / (b-a);
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int t;
cin >> t;
while (t--)
{
cin >> n >> L >> str;
sum[] = ;
for (int i = ; i <= n; i++)
sum[i] = sum[i - ] + str[i - ] - '';
front = rear = -;
int start = , end = L,len=;
double ans = ;
//因为长度至少为L,所以从L开始
for (int t = L; t <= n; t++) //t为线段右端点
{
int j = t - L; //j为线段左端点
//如果rear-1,rear和j是上凸点,那么删去上凸点rear
while (front < rear && cacl(q[rear],j) <= cacl(q[rear - ], q[rear])) rear--;
//加入j
q[++rear] =j;
//第一个和t的斜率小于等于第二个和t的斜率,那么肯定取第二个,删去第一个
while (front < rear && cacl(q[front], t) <= cacl(q[front + ], t)) front++;
//由上一步可得出t和q[front]斜率,这也就是t所能组成的最大斜率
double m = cacl(q[front], t);
int l = t - q[front] + ;
if (m == ans && l<len || m>ans)
{
ans = m;
len = l;
start = q[front];
end = t;
}
}
cout << start + << " " << end << endl;
}
return ;
}

最新文章

  1. PHP之验证码的实现
  2. CF#335 Lazy Student
  3. LTE Module User Documentation(翻译8)——核心网(EPC)
  4. C#——Dictionary&lt;TKey, TValue&gt; 计算向量的余弦值
  5. iOS 可延展视图(点击前显示部分文字,点击后显示全部)
  6. CF 241E flights 最短路,重复迭代直到稳定 难度:3
  7. MySQL参数调优最佳实践
  8. struts2学习笔记(2)——简单的输入验证以及标签库的运用
  9. VS2012 快捷键 VS Resharper 设置
  10. 学习如何看懂SQL Server执行计划(三)——连接查询篇
  11. raise error
  12. 2017 ACM-ICPC西安网赛B-Coin
  13. Introducing DataFrames in Apache Spark for Large Scale Data Science(中英双语)
  14. Atiit 常见功能 常用功能与模块的最快速解决方案
  15. MySQL 创建用户并分配用户权限
  16. hadoop执行wordcount例子
  17. 自己封装framworks上传到应用商店报错
  18. 随手记录-linux-Shellinabox插件
  19. Window 端口占用
  20. 为 ItemsControl 类型的控件提供行号,mvvm模式 绑定集合

热门文章

  1. display:table和display:table-cell结合使用
  2. 网站被XMR恶意挖矿
  3. Apache下设置网站目录的访问权限
  4. RAC禁用DRM特性
  5. win10环境下MySql(5.7.21版本)安装过程
  6. char* a与char a[]的区别
  7. Twitter OA prepare: Flipping a bit
  8. thinkphp 隐藏表单验证原理
  9. php截取制定长度字符串
  10. vs计算代码行数