每日一题——华华给月月准备礼物

华华给月月准备礼物

https://ac.nowcoder.com/acm/problem/23049

题意:原来有n根木棒,然后至少分成k根长,求每根木棒的长度最长为多少。
思路:一个很显然的二分法求解,因为按照题目的意思肯定有一个是最长的,但是还要注意是否为单调变化,单调则用二分,有极值则为三分法,通过打表我们知道是单调的。
特判:结果为0的时候,也就是怎么也找不到一个长度满足题意。
代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int n,k;
bool judge(int x){   //判段函数
    int ans=0;
    for(int i=0;i<n;i++){
        ans+=(a[i]/x);
    }
    if(ans>=k)  return true;
    return false;
}
int main(){
    cin>>n>>k;
    int mx=-1;
    for(int i=0;i<n;i++){
        cin>>a[i];
        mx=max(mx,a[i]);
    }
    int l=1,r=mx,mid;  //规定左右界限
    int ans=0;   //注意这里要先让ans=0,因为可能有找不到的情况
    while(l<=r){
        mid=(l+r)>>1;
        if(judge(mid)){
            ans=mid;   //注意这里记录结果
            l=mid+1; 
        }
        else  r=mid-1;
    }
    cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

09-02 11:14
已编辑
四川大学 Java
吴offer选手:这种面试是最烦的,学不到东西,然后还被挂的莫名其妙。之前看到一种说法是面试官如果不想要你了,就会问一些很简单的问题,防止你举报他
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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