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

题解:
一看就是二分题,注意下上下边界的确定即可。

AC代码:

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define inf -0x3f3f3f3f
#define me(a,b) memset(a,b,sizeof(a))
#define PII pair<int,int>
#define ull unsigned long long
#define ios std :: ios :: sync_with_stdio(false)
#define rep(i,a,b) for(int i = a;i <= b;i ++)
#define esp 1e-16

using namespace std;

const int maxn = 2e5 + 19;

int a[maxn] = {},n,k;

bool check(int x)
{
    //cout << "x = " << x << endl;
    int cnt = 0;
    //if(x == 0) 
    rep(i,1,n) {
        //cout << "cnt = " << cnt << ' ' << a[i] << endl;
        if (a[i] / x > 0) cnt += a[i] / x;
        if (cnt >= k) return 1;
    }
    return 0;
}

int main()
{
    ios;
    cin >> n >> k;
    int maxx = 0;
    rep(i, 1, n) {
        cin >> a[i];
        maxx = max(maxx, a[i]);
    }
    //cout << maxx << endl;
    int l = 1, r = maxx,ans = 0;
    while (l <= r) {
        int mid = (r + l) >> 1;
        if (check(mid)) {
            l = mid + 1;
            ans = max(ans, mid);
        }
        else r = mid - 1;
    }
    cout << ans << endl;
    return 0;
}