COW

COW:

题目描述:

Xiaoming's farm consists of a long row of N (1≤N≤100,000) fields. Each field contains a certain number of cows,0≤ncows≤2000.  Xiaoming wants to build a fence around a contiguous group of these fields in order to maximize the average number of cows per field within that block. The block must contain at least F (1≤F≤N) fields, where F given as input.  Calculate the fence placement that maximizes the average, given the constraint.

输入:

Line 1: Two space-separated integers, N and F.

Lines 2..N+1: Each line contains a single integer, the number of cows in a field. Line 2 gives the number of cows in field 1,line 3 gives the number in field 2, and so on.

样例输入:

10 6
6 
4
2
10
3
8
5
9
4
1

样例输出:

6500

题解:

​ 题目大意:给出一个长度为n的数组,求其中长度不小于f的子序列的最大平均值。

​ 这是一道二分题,这里二分答案即最大平均值,然后我们对于每一个二分值判断在序列中能否找到一段长度不小于f的子序列其平均值大于等于二分结果,如果存在则结果可以更大,所以取l=mid,否则结果更小,所以取r=mid 。对于这题最难想的应该是如何判断区间是否存在一段长度不小于f的序列的平均值大于等于此时二分值。如果说对于一段区间其平均值大于等于mid,那么应该有区间和减去平均值乘以区间长度的结果大于等于0,即,\(\sum_{i=l}^r{sum[i]}-mid*(r-l+1)=\sum_{i=l}^r{(sum[i]-mid)}>=0\),由此想到用前缀和来处理,因为,我们只需找到区间最大的平均值满足条件即可,所以可以在O(n)下找到最大值,配合二分总的时间复杂度在O(log(2000)×n)。

/******************************************
/@Author: LeafBelief
/@Date: 2020-03-07
/@Remark:    
/@FileName: cowsol
******************************************/
#include <bits/stdc++.h>
#define CSE(x, y) memset(x, y, sizeof(x))
#define lowbit(x) (x & (-x))
#define INF 0x3f3f3f3f
#define FAST                     \
    ios::sync_with_stdio(false); \
    cin.tie(0);
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int maxn = 111111;
int n, f;
double sum[maxn], arr[maxn];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.in", "r", stdin);
#endif
    FAST;
    CSE(sum, 0);
    CSE(arr, 0);
    cin >> n >> f;
    for (int i = 1; i <= n; i++)
    {
        cin >> arr[i];
    }
    double l = 0, r = 2002;
    while (r - l > (1e-6))//扩大1000倍后保证数据准确性,所以进度开到了1e-6
    {
        double mid = (l + r) / 2.0;
        double mn = INF;
        double mx = -INF;
        for (int i = 1; i <= n; i++)
        {
            sum[i] = sum[i - 1] + arr[i] - mid;//处理计算平均值的前缀和
        }
        //计算最大区间平均值
        for (int i = f; i <= n; i++)
        {
            mn = min(mn, sum[i - f]);//维护从当前位置向前的最小左端点
            mx = max(mx, sum[i] - mn);//用当前前缀和减去最小的左端点为当前的最大区间平均值,用mx不断取最大来维护结果
        }
        if (mx >= 0)//判断结果是否满足存在区间平均值大于等于当前结果
            l = mid;
        else
            r = mid;
    }
    cout << int(r * 1000) << endl;
    return 0;
}	
全部评论

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
时间线:&nbsp;1.4-1.5:&nbsp;boss&nbsp;牛客&nbsp;官网&nbsp;实习僧海投了两天,&nbsp;感觉确实没啥招人的啊,&nbsp;心里凉了一半.1.6:&nbsp;中午快手约面,&nbsp;下午字节hr飞书私聊约面,&nbsp;当时想着第一次面大厂感觉三个过一个一面就已经赢了.1.7:&nbsp;下午&nbsp;3点大厂处女面,&nbsp;哈哈面试官是重邮红岩的直接保送;&nbsp;5点快手一面,&nbsp;我说这个是我的第二次大厂面试,&nbsp;面试官问要是拿到字节和快手选择哪个,&nbsp;我说昨天看了一晚上快手百分百选快手哈哈哈.&nbsp;晚上5.30字节约二面,&nbsp;快手约二面,&nbsp;小红书约一面.1.8:&nbsp;下午2点快手二面,&nbsp;聊天面体验非常好(当天电话确认入职时间);&nbsp;4点字节二面这次不是校友了,&nbsp;然后有一个CSS实现switch效果的忘记属性咋写了,&nbsp;感觉危了;&nbsp;7.30&nbsp;问字节hr是不是挂了;&nbsp;9点开始小红书一面,&nbsp;难死我了,&nbsp;但我还是笑着面完了,&nbsp;然后卸载了小红书,&nbsp;但是过了一会会小红书hr约二面,&nbsp;遂下回来了字节约三面.1.9:&nbsp;下午2点字节三面,&nbsp;依旧聊天+算法,&nbsp;自己太菜了有一个写错了,&nbsp;面完感觉又危了;&nbsp;5点面小红书20min结束(offer审批);5.30又去问字节hr是不是挂了,&nbsp;hr小姐姐说干嘛用一个句式,&nbsp;我说手写题又又又没写出来😂,&nbsp;2min后约hr面;8.30&nbsp;快手offer总结,&nbsp;自己运气好遇到了好公司好部门好面试官,&nbsp;字节剪映&nbsp;快手电商&nbsp;小红书支付的面试体验都非常好,&nbsp;不会的题会带你一步一步思考,&nbsp;流程也非常快全部都是当天推进,&nbsp;小红书是以分钟为单位推进.&nbsp;&nbsp;面经以及细节等我慢慢整理,&nbsp;&nbsp;以及保佑所有的审批不要出问题,&nbsp;我是真怕最后全过了0offer😂bg:&nbsp;重邮&nbsp;大数据&nbsp;蓝山工作室&nbsp;一段非大厂实习
独角仙梦境:这是真👻了
找实习记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务