社区讨论

二分返回值

P1404平均数参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhj34p1d
此快照首次捕获于
2025/11/03 19:57
4 个月前
此快照最后确认于
2025/11/03 19:57
4 个月前
查看原帖
CPP
#include<iostream>
using namespace std;
const int N=100100;
const double INF=2000,EPS=0.00001;
int n,m;
double l=INF,r,mid,a[N],s[N];
bool check(double x)
{
  double minn=0;
  for(int i=1; i<=n; ++i)
  { 
    s[i]=s[i-1]+a[i]-x;
    if(i>=m)
    {
      minn=min(minn,s[i-m]);
      if(s[i]>=minn)return true;
    }
  }
  return false;
}
double binary_search()
{
  l-=EPS;
  r+=EPS;
  while(l+EPS<r)
  {
    mid=(l+r)/2;
    if(check(mid))l=mid;
    else r=mid;
  }
  return r;
}
signed main()
{
  cin>>n>>m;
  for(int i=1,temp; i<=n; ++i)
  {
    cin>>a[i];
    s[i]=s[i-1]+a[i];
    if(l>a[i])l=a[i];
    if(r<a[i])r=a[i];
  }
  cout<<int(binary_search()*1000.0)<<'\n';
  return 0;
}
为什么返回 rr
左侧是满足 check()check() 的区间,而右侧是不满足的区间
不应该去左侧满足 check()check() 区间的最右端 ll 吗?

回复

4 条回复,欢迎继续交流。

正在加载回复...