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 ;
}

UVa 1451 平均值的更多相关文章

  1. UVA 1451 Average平均值 (数形结合,斜率优化)

    摘要:数形结合,斜率优化,单调队列. 题意:求一个长度为n的01串的子串,子串长度至少为L,平均值应该尽量大,多个满足条件取长度最短,还有多个的话,取起点最靠左. 求出前缀和S[i],令点Pi表示(i ...

  2. UVa 1451 Average - 斜率优化

    A DNA sequence consists of four letters, A, C, G, and T. The GC-ratio of a DNA sequence is the numbe ...

  3. UVa 1451 (数形结合 单调栈) Average

    题意: 给出一个01串,选一个长度至少为L的连续子串,使得串中数字的平均值最大. 分析: 能把这道题想到用数形结合,用斜率表示平均值,我觉得这个想法太“天马行空”了 首先预处理子串的前缀和sum,如果 ...

  4. UVA 1451 Average

    A DNA sequence consists of four letters, A, C, G, and T. The GC-ratio of a DNA sequence is the numbe ...

  5. uva 1451 数形结合

    思路:枚举点t,寻找满足条件的点t': 计sum[i]为前i项合,平均值即为sum[t]-sum[t'-1]/t-t'+1 设(Pi=(i,Si),表示点在s中的位置,那么就可以画出坐标图,问题就转化 ...

  6. 紫书 例题8-9 UVa 1451 (数形结合)

    这道题用了数形结合, 真的牛逼, 完全想到不到还可以这么做 因为题目求的是平均值, 是总数除以个数, 这个时候就可以联系 到斜率, 也就是说转化为给你一堆点, 让你求两点之间的最大斜率 要做两个处理 ...

  7. 【UVA 1451】Average

    题 题意 求长度为n的01串中1占总长(大于L)的比例最大的一个子串起点和终点. 分析 前缀和s[i]保存前i个数有几个1,[j+1,i] 这段区间1的比例就是(s[i]-s[j])/(i-j),于是 ...

  8. UVA - 1451 Average (斜率优化)

    题意:由01组成的长度为n的子串,AT由0表示,GC由1表示,求一段长度大于等于L且GC率最高的子串的起始终止坐标,若GC率相同,取长度较小,若长度相同,取起始坐标最小. 分析: 1.一个子串(i+1 ...

  9. 1451 - Average 高速求平均值

    怎样高速求取一段区间的平均值 用前缀的思想来看 很easy 可是 本题题意要求的是 大于等于一段长度的区间的平均值的最大值 并且给出的数据范围非常大 O(n*L)的直白比較算法 用于解决此问题不合适 ...

随机推荐

  1. R中双表操作学习[转载]

    转自:https://www.jianshu.com/p/a7af4f6e50c3 1.原始数据 以上是原有的一个,再生成一个新的: > gene_exp_tidy2 <- data.fr ...

  2. CentOS6.5安装RHadoop

    1.首先安装依赖包(各个节点都要安装) [root@Hadoop-NN-01 ~]$ yum install gcc-gfortran #否则报”configure: error: No F77 co ...

  3. 单利模式及python实现方式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  4. AspxGridView点滴

    1:页码设置 1>: <SettingsPager Summary-Text="当前第 {0} 页 总共 {1} 页 ({2} 条记录)"></Settin ...

  5. C#+Aspose.Cells 导出Excel及设置样式 (Webform/Winform)

    在项目中用到,特此记录下来,Aspose.Cells 不依赖机器装没有装EXCEL都可以导出,很方便.具体可以参考其他 http://www.aspose.com/docs/display/cells ...

  6. \r与\n

    \n是换行,英文是New line \r是回车,英文是Carriage return

  7. no-siteapp 和 no-transform

    简单的说,是禁止转码 . 举个通俗的例子. 你建了一栋房子(网站),百度说我给你做个大门,但是大门上要有我的广告 你不愿意,就建立了一条路叫no-transform 别人去你家走这条路就行了 后来百度 ...

  8. python利用WMI监控windows状态如CPU、内存、硬盘

    安装pywin32库 下载地址: https://sourceforge.net/projects/pywin32/files%2Fpywin32/选择对应python版本的文件.下载后在window ...

  9. 20165207 Exp0 Kali安装

    Exp0 Kali安装 选哪个 在打开www.kali.org的网页之后,我进入其下载页面,可供下载的kali版本有很多 对于选择哪个版本,在实验楼我用过xfce桌面.下面还有直接下下来就可以在vm里 ...

  10. 微信分享缩略图,如何增加微信朋友圈分享链接的小图片? facebook、google+、twitter等分享的标签

    微信分享缩略图 如何增加微信朋友圈分享链接的小图片?在网页的头部<head>标签内加上以下代码,图片路径自行修改.<head><div id='wx_pic' style ...