题

题意

求长度为n的01串中1占总长(大于L)的比例最大的一个子串起点和终点。

分析

前缀和s[i]保存前i个数有几个1,[j+1,i] 这段区间1的比例就是(s[i]-s[j])/(i-j),于是问题转换为找斜率最大的两个点。

如图,加入j时,就要去掉b1、b2,才能维护斜率的单调递增。

以队列里的点做起点,i 结尾的线段斜率最大的是 i和队列里点组成的下凹线的切线。切点前的点就不会再用到了,因为i后面的点和他们的斜率也将不如和这个切点的斜率。

数形结合,斜率优化,单调队列。

代码

#include<deque>
#include<cstdio> using namespace std; deque<int> q; int s[];
int ansl,ansr; int great(int a,int b,int c,int d)//求ab斜率是否大于cd斜率
{
return (s[a]-s[b])*(c-d) - (s[c]-s[d])*(a-b);
} int main()
{
int t,L,n,a;
scanf("%d",&t);
while(t--)
{
scanf("%d%d ",&n,&L);
char cc;
for(int i=;i<=n;i++){
cc=getchar();
s[i]=s[i-]+cc-'';//这样读才不会超时
}
q.clear();
ansl=;
ansr=L;
for(int i=L; i<=n; i++)//以i做线段右端点
{
int j=i-L;
while(q.size()>)//把j作为线段左端点,加入单调队列
{//(单调指斜率单调递增)
int b1=q[q.size()-];//倒数第1个
int b2=q[q.size()-];//倒数第2个
if(great(b1,b2,j,b1)>)//如果b1b2斜率比jb1更大
q.pop_back();//弹出b1,维护单调性
else break;//
}
q.push_back(j);//j入队
while(q.size()>)//去掉队前头不优的起点(线段左端点)
{//因为和i斜率最大的是下凹线的切点,切点前的点不优
if(great(i,q[],i,q[])<=)//以i做终点 q[0]i的斜率小于q[1]i的斜率
q.pop_front();//就弹出队头
else break;
}
int tmp=great(i,q[],ansr,ansl);//i和切点的斜率,也就是最大斜率
if(tmp> || tmp== && i-q[]<ansr-ansl)
{
ansl=q[];//左端点更新
ansr=i;//右端点更新
}
}
printf("%d %d\n",ansl+,ansr);//存的是左端点右1的点,故输出时+1
}
return ;
}

  

【UVA 1451】Average的更多相关文章

  1. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

    偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...

  2. 【贪心+中位数】【UVa 11300】 分金币

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  3. 【UVa 10881】Piotr's Ants

    Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...

  4. 【UVa 116】Unidirectional TSP

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  5. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  6. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 【uva 1025】A Spy in the Metro

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. 【Uva 11584】Partitioning by Palindromes

    [Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...

  9. 【Uva 11400】Lighting System Design

    [Link]: [Description] 你要构建一个供电系统; 给你n种灯泡来构建这么一个系统; 每种灯泡有4个参数 1.灯泡的工作电压 2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的 ...

随机推荐

  1. codeforces 713A A. Sonya and Queries(状态压缩)

    题目链接: A. Sonya and Queries time limit per test 1 second memory limit per test 256 megabytes input st ...

  2. 常用中文字体 Unicode 编码

    各大网站的字体选择 网站 字体 腾讯 font: 12px "宋体","Arial Narrow",HELVETICA; 淘宝 font: 12px/1.5 t ...

  3. Google Map API 使用总结

    Google Map API (一):显示一个最基本的地图 1 实现一个地图:<head>中引用: <script type="text/javascript" ...

  4. ArcGIS Engine 中 线加箭头

            ;             ICartographicLineSymbol pCartoLineSymbol = );             IArrowMarkerSymbol p ...

  5. 一篇文章告诉你为何GitHub估值能达20亿美元

    软件开发平台GitHub今日宣布,已获得硅谷多家知名风投2.5亿美元融资,这也让其融资总额达到了3.5亿美元,此轮融资对GitHub的估值约为20亿美元. GitHub有何特别之处? GitHub创立 ...

  6. 如何将list转为json?

  7. http请求过程

    想象用浏览器打开imooc.com网站,HTTP走过的环节: 1.首先,是对imooc.com域名解析,(1.1)浏览器搜索浏览器自身的DNS缓存.(DNS(Domain Name System,域名 ...

  8. Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 )

    本文来自:http://www.cnblogs.com/hezihang/p/6083555.html Delphi采用接口方式设计模块,可以降低模块之间的耦合,便于扩展和维护.本文提供一个实现基于接 ...

  9. Kakfa分布式集群搭建

    本位以最新版本kafka_2.11-0.10.1.0版本讲述分布式kafka集群环境的搭建过程.服务器列表: 172.31.10.1 172.31.10.2 172.31.10.3 1.下载kafka ...

  10. char 转wchar_t 及wchar_t转char

    利用WideCharToMultiByte函数来转换,该函数映射一个unicode字符串到一个多字节字符串.通常适合于window平台上使用. #include <tchar.h> #in ...