题目描述
给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m。
输入输出格式
输入格式:
N+1行,
第一行两个整数n和m
接下来n行,每行一个整数a[i],表示序列第i个数字
输出格式:
一个整数,他是最大平均数的1000倍,如果末尾有小数,直接舍去,不要用四舍五入求整。
输入输出样例
说明
【数据范围】
60% M<=N<=10000
100% M<=N<=100000 0<=a[i]<=2000
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; double ans; int num[100001],sum[100001]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&num[i]); for(int i=1;i<=n;i++) sum[i]=sum[i-1]+num[i]; for(int k=m;k<=n;k++) for(int i=0;i+k<=n;i++) ans=max(ans,(sum[i+k]-sum[i])*1.0/(k*1.0)); cout<<int(ans*1000); }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; long long l,r,mid; long long num[100001],sum[100001]; bool judge(long long now){ long long Min=0x7f7f7f7f; for(int i=1;i<=n;i++){ sum[i]=sum[i-1]+num[i]-now; if(i>=m){ Min=min(Min,sum[i-m]); if(sum[i]>=Min) return true; } } return false; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ cin>>num[i]; num[i]*=10000; } l=0;r=20000000; while(l<=r){ mid=(l+r)/2; if(judge(mid)) l=mid+1; else r=mid-1; } cout<<l/10; }