牛客练习赛63 牛牛的揠苗助长(二分)

题目传送门

题目描述

牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号、2号…n号菜地,然后他往每块菜地中都种下了一些水稻,一开始,第i块菜地中的水稻高度均为a[i]个单位。然后我们知道水稻的生长周期都是n天,也就是说每逢n天水稻就会长高一个单位。但是不巧的是整个菜园中每一块菜地的生长周期都错开了,具体来说,第1天的时候第1块菜地中的水稻长高一个单位,第2天的时候第2块菜地中的水稻长高一个单位…第n天的时候第n块菜地中的水稻长高一个单位,接下来第n+1天,又轮到第1块菜地中的水稻长高一个单位以此类推。

每天在水稻进行自然生长之后,牛牛可以施展他神奇的魔法,这个魔法可以让任意一块菜地中的水稻长高一个单位,或者让任意一块菜地中的水稻缩短一个单位,当然啦,他也可以不进行任何操作。

牛牛看到菜园中的水稻参差不齐十分难受,请问至少在第几天,他能够让所有的水稻都长到同一个高度?

输入描述:
第一行是一个正整数n (0-1e5)
表示有菜园有n块菜地。
接下来一行输入n个正整数,表示每块菜地上水稻的高度

保证一开始输入时水稻的高度不全都相同(数据保证答案至少为1)。

输出描述:
输出一个正整数表示问题的答案。
示例1

输入

3
1 2 3

输出

1

说明

第一天,第一块菜地的水稻高度增加1,牛牛使用他的魔法使得第三块菜地的水稻再减少1。
此时三块水稻的高度为2 2 2.所有水稻的高度均相同。所以答案为1天。

思路:很明显的是对天数进行二分搜索,但是我们怎么判断给定的一个天数是不是可以让其对齐呢,这里我们先让每一株水稻加上这n填循环的次数,假设我们此时判断的是day天数时是不是满足条件,那么在这day天里我们所有的水稻都要增长day/n 单位高度,然后前day%n 个水稻是要在这基础上再增加1,然后这时候所有的水稻还是层次不齐的,但是我们还有day次操作,那因为是参差不齐的,我们想让水稻通过施魔法之后变得等高,当某一刻变成等高的时候,无论后面哪个长一个单位我们都可以用魔法让它变成等高时候的高度,然后这里有一个数学定理:数列各个数到中位数的距离和最小,就是说我们对所有的水稻施魔法,让它变成最中间的那个水稻的高度,然后这样总的施魔法次数就是最小的,然后我们一共可以施day次魔法,所以就那总的次数跟day作比较即可。拿官方题解的一个图,更形象的说明一下!

在这里插入图片描述

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;
int a[maxn],temp[maxn],n;
ll check(ll day){
    ll group=day/n;ll remain=day%n;
    for(int i=1;i<=n;i++){
        temp[i]=group+a[i];
        if(remain){
            temp[i]+=1;remain-=1;
        }
    }
    sort(temp+1,temp+n+1);
    ll sum=0;
    for(int i=1;i<=n;i++){
        sum+=abs(temp[i]-temp[n/2+1]);
    }
    return sum<=day;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    ll l=1,r=1e18;
    while(l<r){
        ll mid=(l+r)>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
}

谢谢您访问我的博客!

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值