Codeforces Round #540 (Div. 3) 문제 풀이

문제 링크:

https://codeforces.com/contest/1118

A 문제:

문제 설명:

q 번의 쿼리가 주어지며, 각 쿼리마다 숫자 n 이 주어집니다. 숫자 1 과 2 를 사용하여 n 을 만들되, 1 의 비용은 a이고 2 의 비용은 b입니다. 최소 비용을 구하세요.

해결 방법:

만약 2a <= b라면 모두 1로 구성하는 것이 가장 유리합니다. 반면에 2a > b라면, n이 홀수라면 하나의 1과 나머지를 2로, 짝수라면 모두 2로 구성하면 됩니다.

코드 예시:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int q;
    cin >> q;
    while(q--){
        long long n, a, b;
        cin >> n >> a >> b;
        if(2 * a <= b){
            cout << n * a << "\n";
        }
        else{
            cout << (n / 2) * b + ((n % 2) * a) << "\n";
        }
    }
}

View Code

B 문제:

문제 설명:

n 개의 수가 주어졌을 때, 그 중 하나를 제거한 후 남은 수들의 순서를 유지한 상태에서 홀수 인덱스와 짝수 인덱스의 합이 동일해지는 경우의 수를 계산하세요.

해결 방법:

특정 수를 제거하면 그 이후의 수들은 인덱스의 홀짝성이 바뀌게 됩니다. 이를 고려하여 홀수와 짝수 인덱스의 누적합을 계산하여 비교하면 됩니다.

코드 예시:

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 200005;
long long arr[MAXN], oddSum[MAXN], evenSum[MAXN];

int main(){
    int n;
    cin >> n;
    for(int i=1; i<=n; ++i){
        cin >> arr[i];
        oddSum[i] = oddSum[i-1];
        evenSum[i] = evenSum[i-1];
        if(i%2 == 1) oddSum[i] += arr[i];
        else evenSum[i] += arr[i];
    }
    int result = 0;
    for(int i=1; i<=n; ++i){
        if(oddSum[i-1] + (evenSum[n] - evenSum[i]) == evenSum[i-1] + (oddSum[n] - oddSum[i])){
            result++;
        }
    }
    cout << result;
}

View Code

C 문제:

문제 설명:

nxn 크기의 행렬을 구성하되, 모든 행과 열이 팬더롬(palindrome)이 되도록 하세요.

해결 방법:

주어진 조건에 따라 행렬을 구성하면 됩니다.

코드 예시:

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 25;
int matrix[MAXN][MAXN], countArr[1007];

int main(){
    int n;
    cin >> n;
    for(int i=0; i<n*n; ++i){
        int x;
        cin >> x;
        countArr[x]++;
    }
    if(n % 2 == 0){
        for(int i=1; i<=1000; ++i){
            if(countArr[i] % 4 != 0){
                cout << "NO\n";
                return 0;
            }
        }
        // Construct matrix here...
    }
    else{
        // Similar logic as above...
    }
    cout << "YES\n";
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=n; ++j){
            cout << matrix[i][j] << " ";
        }
        cout << "\n";
    }
}

View Code

D 문제:

문제 설명:

커피와 과제가 주어졌을 때, 최소한의 날짜 안에 과제를 완료해야 합니다.

해결 방법:

커피의 효과를 내림차순으로 정렬한 후, 이분 탐색을 통해 필요한 최소 날짜를 찾습니다.

코드 예시:

#include <bits/stdc++.h>
using namespace std;

bool isValid(vector<int>& coffee, int days, int pages){
    long long total = 0;
    int penalty = 0;
    for(int i=0; i<days && i<coffee.size(); ++i){
        total += coffee[i];
    }
    for(int i=days; i<coffee.size(); ++i){
        penalty++;
        if(coffee[i] - penalty > 0){
            total += coffee[i] - penalty;
        }
        else break;
    }
    return total >= pages;
}

int main(){
    int n, m;
    cin >> n >> m;
    vector<int> coffee(n);
    long long sum = 0;
    for(auto &x : coffee){
        cin >> x;
        sum += x;
    }
    if(sum < m){
        cout << "-1\n";
        return 0;
    }
    sort(coffee.rbegin(), coffee.rend());
    int left = 1, right = n, answer = n;
    while(left <= right){
        int mid = (left + right)/2;
        if(isValid(coffee, mid, m)){
            answer = mid;
            right = mid - 1;
        }
        else{
            left = mid + 1;
        }
    }
    cout << answer;
}

View Code

태그: Codeforces C++ algorithm

5월 25일 03:19에 게시됨