[CQOI2010] 트럼프 (2 점)

제목 링크 : 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.
  • 최대 값은 2e10에 대해 5e8 * 50이므로 int를 버스트하므로 여기서 cnt는 오래 열어야합니다.

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