UVA寫題記錄
阿新 • • 發佈:2020-08-04
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 < 'View Code0'|| 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(doublex) { 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); } }