1. 程式人生 > 實用技巧 >UVA寫題記錄

UVA寫題記錄

UVA寫題記錄

UVA 1451

Description

求一個長度為N的01串長度至少為L的子串的數字平均值最大的起點和終點

Solution

可以看成斜率來做

但我寫的二分,二分平均值然後掃一遍就行了

O(nlogn)

#include<bits/stdc++.h>

using namespace std;

inline int read()
{
    int f = 1,x = 0;
    char ch;
    do
    {
        ch = getchar();
        if(ch == '-') f = -1;
    }while(ch < '
0'|| ch > '9'); do { x = (x<<3) + (x<<1) + ch - '0'; ch = getchar(); }while(ch >= '0'&&ch <= '9'); return f*x; } #define eps 1e-6 const int MAXN = 100000 + 10; int T,pos; int ans1,ans2; int n,L; char a[MAXN]; double sum[MAXN]; inline bool check(double
x) { for(int i=1;i<=n;i++) sum[i] = sum[i-1] + a[i-1] - '0' - x; double minn = 0,maxx = -200000.0; for(int i=L;i<=n;i++) { if(minn >= sum[i-L]) minn = sum[i-L],pos=i-L+1; if(sum[i]-minn>maxx + eps) { maxx = sum[i] - minn; ans1 = pos; ans2
= i; } } if(maxx + eps > 0) return 1; return 0; } int main() { T = read(); while(T--) { n = read(),L = read(); scanf("%s",a); double l = 0.0 ,r = 1.0; for(int i=1;i<=100;i++) { double mid = (r+l)/2.0; if(check(mid)) l = mid; else r = mid; } // check(l+eps); printf("%d %d\n",ans1,ans2); } }
View Code