题目背景
为了让俱乐部的孩子们放假在家学习,mxj特地为俱乐部的孩子们准备了一个winter camp, 在举办之前,mxj想让大家热热身,于是让大家报出了自己收到的压岁钱数,并排成了一个正整数序列A。
题目描述
mxj会给你一个长度len, 让你从这个整数序列A中找到 长度大于等于len 且 平均数最大的一个连续的子序列 。
输入输出格式
输入格式:
第一行,一个正整数N,表示俱乐部人数,一个正整数len,表示子列长度。
接下来N行,每行一个正整数,表示压岁钱。
输出格式:
一个正整数S,表示最大的平均数X*1000的结果。
输入样例#1:
10 6
6
4
2
10
3
8
5
9
4
1
输出样例#1:
6500
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <iostream>
#include<string.h>
using namespace std;
const int inf=100001;
int n,m;
double a[inf],b[inf],l=-1e6,r=1e6;
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%lf",&a[i]);
while (r-l>1e-5)//精度
{
double mi=(l+r)/2;
for (int i=1;i<=n;i++)//前缀和
b[i]=a[i]-mi+b[i-1];
double ans=-1e10,num=1e10;//取一个最大数和最小数
for (int i=m;i<=n;i++)//求最大平均值
{
num=min(num,b[i-m]);
ans=max(b[i]-num,ans);
}
if (ans>=0)
l=mi;
else
r=mi;
}
printf("%d",int(r*1000));//题目要求截取*1000之后的整数部分。
}