1434:【例题2】Best Cow Fences时间限制: 1000 ms 内存限制: 65536 KB 提交数: 263 通过数: 146 【题目描述】给定一个长度为n的正整数序列A。求一个平均数最大的,长度不小于L的子序列。 【输入】第一行,n和L; n个正整数,表示A。 【输出】一个整数,表示答案的1000倍(不用四舍五入,直接输出)。 【输入样例】10 6 6 4 2 10 3 8 5 9 4 1 【输出样例】6500 【提示】n ≤ 10000 思路:: |
问题转化
1.是否存在一个长度不小于L的子段,子段序列和为非负。及二分查找
2.子段序列和可以是后段减前段
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; double a[100001],b[100001],sum[100001]; int main(){ int N,L; cin>>N>>L; for(int i=1;i<=N;i++){ cin>>a[i]; } double eps=1e-5; double l=-1e-6,r=1e6; while(r-l>eps){//二分答案 double mid=(l+r)/2; for(int i=1;i<=N;i++) b[i]=a[i]-mid; for(int i=1;i<=N;i++) sum[i]=(sum[i-1]+b[i]); double ans=-1e10; double minn=1e10; for(int i=L;i<=N;i++){ minn=min(minn,sum[i-L]); ans=max(ans,sum[i]-minn); //前缀和相减 } if(ans>=0) l=mid; else r=mid; } cout<<int(r*1000)<<endl; return 0; }