3.23 每日一题题解

小明爱玩牌

题目链接:

涉及知识点:

  • 思维/二分

solution:

  • 假设x就是我们要求的答案,我们知道我们一定可以组合出x - 1套牌,那么x + 1 套牌我们是组合不出来的

  • 假如 我们组合出 x 套牌,那么如果 x > m 的话,那么我们就首先把 m 个万能牌用到,如果x < m 的话,我们最多需要用到x张万能牌,所以ans = min(x,m)

  • 所以,假如我们能组合出x套牌,那么if(a[i] > x),我们就不需要把万能牌用到a[i] > x上,if(a[i] < x),那么我们就需要用到x - a[i]张万能牌,当然我们的ans -= x - a[i]

  • 显然,如果到最后我们的ans大于0,则表示我们的万能牌还有剩余,或者是万能牌的个数恰好为0,则我们可以组成x套牌

  • 由于本题没有题目链接,大家可以找雒东月要数据,数据的截止日期4月1日

std:

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5+10;

int n,m;
int a[N];
int l = 0;
int r = 1e9;
bool check(int x)
{
    int ans = min(m,x);
    
    for (int i = 1; i <= n; i ++ )
    {
        if(a[i] < x)
        {
           ans -= x - a[i];
        }
        if(ans < 0)
        {
            return false;
        }
    }
    return true;
}

int main()
{
    int res = 0;
//    freopen("in.txt", "r", stdin);
    scanf("%d%d",&n,&m);
    for (int i = 1 ; i <= n ; i ++ ) scanf("%d",&a[i]);
    while(l <= r)
    {
        int mid = (l+r)/2;
        if(check(mid))
        {
            res = mid;
            l = mid+1;
        }
        else r = mid-1;
    }
    
    cout << res << endl;
    
    return 0;
}
原文地址:https://www.cnblogs.com/QFNU-ACM/p/12552211.html