【第22期】观点:IT 行业加班,到底有没有价值?

1451 - Average(数形结合)

原创 2015年07月06日 19:16:59

该题表面让我们求一个字符串的问题,但是却可以转化成求斜率的问题, 紫书上已经说的很清楚了,我这里就不再赘述  。

代码如下 :

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 5;
int n,T,L;
double a[maxn],p[maxn];
char s[maxn];
int campare(int x1,int x2,int x3,int x4){   //直线p[x1]p[x2]的斜率减去p[x3]p[x4]的斜率
    return (a[x1] - a[x2-1])*(x3-x4+1) - (a[x3] - a[x4-1])*(x1-x2+1); 
}
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%s",&n,&L,s);
        int len = strlen(s);
        a[0] = 0;
        for(int i=0;i<len;i++){
            a[i+1] = a[i] + s[i] - '0'; //a[i]为前i项的和
        }
        int l = 1, r = L , i = 0 , j = 0; //用两个指针 i 和 j 来动态维护下凸区间。
        for(int t = L;t <= len;t ++) {
            while(j - i > 1 && campare(t-L,p[j-2],t-L,p[j-1])>=0) j--; //删除上凸的点
            p[j++] = t - L + 1; //增加新元素
            while(j - i > 1 && campare(t,p[i+1],t,p[i])>=0) i++; //确定新的切点,因为切点的x坐标一定是不断增加的
            int c = campare(r,l,t,p[i]);
            if(c < 0 || c == 0 && (r-l)>(t-p[i])) { 
                l = p[i] ; r = t ;
            }
        }
        cout<<l<<' '<<r<<endl;
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

数形结合、单调队列+uva1451

解题思路:      1. 这题是一道数形结合的问题, 我从《浅谈数形结合思想在信息学竞赛中的应用》学习而得算法.      设Sum[i] = a1+a2+...+ai,那么平均值ave(i...

uva 1451 - Average(数形结合)

题目链接:uva 1451 - Average 题目大意:给出n和L,表示有一个长度为01组成的字

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

ACM题库以及培养策略

ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge。除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库。 USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息...

1451 - Average(数形结合)

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

ACM题库以及培养策略

ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge。除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库。 USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)