平均数

xiaoxiao2025-10-14  9

传送门

二分答案 主要是判断函数 我们用的是减去mid的前缀和 成立条件是,存在form[i]<form[j]&&j-i>=m

代码如下:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; long long l,r; long long num[100005],form[100005]; int check(long long ans){ long long M=0; form[0]=0; for(int i=1;i<=n;i++){ form[i]=form[i-1]+num[i]-ans; if(i>=m){ M=min(M,form[i-m]); if(form[i]>M){ return 1; } } } return 0; } long long dmax(long long a,long long b){ return a<b?b:a; } int main(){ scanf("%d%d",&n,&m); num[0]=0; r=0; for(int i=1;i<=n;i++){ int x; scanf("%d",&x); x=x*10000; r=dmax(r,x); num[i]=x; } l=0; long long mid; while(l<=r){ mid=(l+r)/2; if(check(mid)){ l=mid+1; }else{ r=mid-1; } } printf("%lld",l/10); return 0; }
转载请注明原文地址: https://www.6miu.com/read-5037900.html

最新回复(0)