Poj2018 Best Cow Fences
传送门
题目大意就是给定一个长度为 n 的正整数序列 A ,求一个平均数最大的,长度不小于 L 的子序列。
思路:
二分答案。
Code:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<cstdlib> #include<stack> #include<vector> #include<queue> #include<deque> #include<map> #include<set> using namespace std; #define lck_max(a,b) ((a)>(b)?(a):(b)) #define lck_min(a,b) ((a)<(b)?(a):(b)) typedef long long LL; const int maxn=1e7+7; LL N,L; double a[maxn],b[maxn],sum[maxn]; inline double resd() {double ls;scanf("%lf",&ls);return ls;} inline LL read() { LL kr=1,xs=0;char ls; ls=getchar(); while(!isdigit(ls)) { if(!(ls^45)) kr=-1; ls=getchar(); } while(isdigit(ls)) { xs=(xs<<1)+(xs<<3)+(ls^48); ls=getchar(); } return xs*kr; } int main() { N=read();L=read(); for(LL i=1;i<=N;i++) a[i]=resd(); double l=-1e6,r=1e6,eps=1e-5; while(r-l>eps) { double mid=(l+r)/2; for(LL i=1;i<=N;i++) b[i]=a[i]-mid; for(LL i=1;i<=N;i++) sum[i]=sum[i-1]+b[i]; double maxx=-1e10,minn=1e10; for(LL i=L;i<=N;i++) minn=lck_min(minn,sum[i-L]),maxx=lck_max(maxx,sum[i]-minn); if(maxx>=0) l=mid; else r=mid; } printf("%lld\n",LL(r*1000)); return 0; }