题解 | #Best Cow Fences#

Best Cow Fences

https://ac.nowcoder.com/acm/contest/1000/A

#include<bits/stdc++.h>

using namespace std;

#define int long long 
#define debug printf("++zhangyx++");

const int N = 1e6;
unordered_map<int,int>mp;
double n,m;
double a[N];
double sum[N];

//本人错误的写法
//bool check(double avg)
//{ //个人感觉应该是精度的问题 
//欢迎dalao指点
//不喜可随便pen
//那个 前缀的地方 
//  for(int i=1;i<=n;i++){
   //  for(int j=i+m;j<=n;j++){
  ///       if((sum[j] - sum[i])/(j-i)>=avg) return true;    
  //       } 
  //    }
  //  return false;
//}

bool check(double avg)
{
  for(int i=1;i<=n;i++)
     sum[i] = sum[i-1]+a[i]-avg; //使得每个数都减去avg然后在加起来以判断此时的avg1和avg的大小

     double mins = 0; //其中 i表示右端点 而就j表示左端点
 for(int i = m,j = 0;i<=n;i++,j ++) //这个应该是双指针的奇妙写法 本人不是很懂
  {
     mins = min(mins, sum[j]); // 因为干开始肯定是sum[j] = 0的\
      //然后由于i指针向后动 所以可以更新其最小前缀 然后跟新最大字段 
     //使得j前缀和尽可能小
          //从而使得区间和尽可能的大
     if(sum[i] - mins >= 0) return true; //一旦发现可以>=二分的avg就直接 true
   }

    return false; //如果全部都没有就直接全部退出
}

void solve()
{
      cin >> n >> m;

  for(int i=1;i<=n;i++){
        cin >> a[i];
    // sum[i] = a[i] + sum[i-1];
    // 其实答案的最大值就是最大的a[i]
   }

   double l =0,r = 2*1e6;
     double mid;

      //double型的二分的写法
   while(r-l>1e-6) 
   {
        mid = (l+r)/2;  
     if(check(mid)) l =mid; 
        else r = mid;
   }    

   printf("%d\n",(int)(r*1000));
    //向下取整的写法
}

signed main()
{
   cin.tie(0);    
   cout.tie(0);
 ios::sync_with_stdio(false); 

  int T = 1;//cin >> T;
 while(T--) solve();

   return 0;
}

全部评论

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务