[CQOI2010]扑克牌(二分)

题目链接:https://ac.nowcoder.com/acm/problem/19916

题目大意

  • n种普通牌,每种牌ci张,m张万能牌
  • 一副牌一共n张,就是n种普通牌每种一张,万能牌可以代替n种普通牌中的任意一种,并且在一副牌中最多只能用一张
  • 求这些牌最多可以组成多少副牌
  • 范围:2< = n < = 50, 0 < = m, ci <= 500,000,000

思路

  • 二分。
  • 假设一共可以组成x副牌,然后计算每种牌欠的数量,累加成cnt。
  • 首先cnt要小于等于m,万能牌要够用才行;然后是每副牌最多出现一次,所以最多是x张。所以cnt<=x&&cnt<=m。
  • 这里的cnt要开long long,因为最大是5e8*50超过2e10,爆int了

ac代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[105], n, m;
bool check(int x){
    ll cnt = 0;
    for(int i = 1; i <= n; i ++){
        cnt += max(0, x - a[i]);
    }
    return cnt <= x && cnt <= m;
}
int main(){
    int l = 0, r = 1e9, ans = 0;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++){
        scanf("%d", &a[i]);
    }
    while(l <= r){
        int mid = l + r >> 1;
        if(check(mid)) l = mid + 1, ans = mid;
        else r = mid - 1;
    }
    printf("%d\n", ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43911947/article/details/113499395