【CQOI2010】トランプ(2点)

タイトルリンク:https//ac.nowcoder.com/acm/problem/19916

トピック

  • n種類の普通カード、各種類のciカード、mユニバーサルカード
  • デッキには合計n枚、つまりn種類の普通のカードに1枚ずつあります。ユニバーサルカードはn種類の普通のカードのいずれかを置き換えることができ、デッキで使用できるカードは1枚だけです。
  • これらのカードで構成できるカードのセット数
  • 范围:2 <= n <= 50、0 <= m、ci <= 500,000,000

アイデア

  • 2点。
  • 合計xセットのカードを作成できると仮定して、各カードの未払い額を計算し、合計してcntにします。
  • まず、cntはm以下でなければならず、ユニバーサルカードで十分でなければなりません。次に、カードの各デッキは最大で1回出現できるため、最大でx枚のカードが表示されます。したがって、cnt <= x && cnt <= mです。
  • ここでのcntは、2e10を超える最大値が5e8 * 50であるため、長く開く必要があります。これにより、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