洛谷 P1404 平均数

题目描述

给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m。

输入输出格式

输入格式:

 

N+1行,

第一行两个整数n和m

接下来n行,每行一个整数a[i],表示序列第i个数字

 

输出格式:

 

一个整数,他是最大平均数的1000倍,如果末尾有小数,直接舍去,不要用四舍五入求整。

 

输入输出样例

输入样例#1: 复制
10 6
6
4
2
10
3
8
5
9
4
1
输出样例#1: 复制
6500

说明

【数据范围】

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);
}
71
#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;
}
100

猜你喜欢

转载自www.cnblogs.com/cangT-Tlan/p/9724587.html