Algorithm/코드포스

Codeforces Round #746 (Div. 2) , 1603 -> 1550 (-53)

Edyy 2021. 10. 4. 08:12

Dashboard - Codeforces Round #746 (Div. 2) - Codeforces

 

Dashboard - Codeforces Round #746 (Div. 2) - Codeforces

 

codeforces.com

!!!! 모든 답은 제 풀이일 뿐 정해가 아닐 수 있습니다 !!!!

 

A. Gamer Hemose

Problem - A - Codeforces

 

Problem - A - Codeforces

 

codeforces.com

문제

 

n 개의 무기 공격력이 주어질 때, 체력이 H인 적을 잡을 수 있는 최소 무기 사용 횟수, 이때 연속으로 같은 무기를 사용할 수 없다

 

풀이

 

가장 큰 값 2개를 sum 으로 두고, H를 sum 으로 나눈 몫 + 나머지를 계산해준다.

 

코드

 

#include <bits/stdc++.h>
using namespace std;
long long a[10001];
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int T;
    cin >> T;
    while (T--) {
        long long n, m;
        cin >> n >> m;
        for (int i = 0; i < n; i++)cin >> a[i];
        sort(a, a + n);
        long long sum = a[n - 1] + a[n - 2],ans=0,total=0;
        long long div = m / sum;
        total += div * sum;
        ans += div * 2LL;
        for (int i = n - 1; i >= n - 2; i--) {
            if (total >= m)break;
            total += a[i];
            ans++;
        }
        cout << ans << '\n';
    }
}

 

B. Hemose Shopping

Problem - B - Codeforces

 

Problem - B - Codeforces

 

codeforces.com

문제

 

n과 d가 주어졌을 때, 길이가 n일 배열을 정렬해야 한다. 이때 서로 다른 위치에 대해서, 서로의 거리가 최소 d 인 원소끼리만 swap 할 수 있다. 이 때 최종적으로 배열이 non-decreasing order로 sorting이 가능한지 판별하는 문제

 

풀이

 

서로가 swap을 할 수 있는 위치끼리 check 하고, check가 안된 위치에 대해서만 sorting이 돼있는지 확인한다.

 

코드

 

#include <bits/stdc++.h>
using namespace std;
long long a[100010],b[100010];
bool check[100010];
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int T;
    cin >> T;
    while (T--) {
        long long n, x;
        cin >> n >> x;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            b[i] = a[i];
        }
        if (x == n) {
            bool flag = true;
            for (int i = 2; i <= n; i++) {
                if (a[i - 1] > a[i]) {
                    flag = false;
                    break;
                }
            }
            if (flag)cout << "YES\n";
            else cout << "NO\n";
            continue;
        }
        check[1] = true;
        for (int i = 1+x; i <= n; i++) {
            check[i] = true;
        }
        for (int i = 2; i <= n; i++) {
            if (i + x > n)break;
            check[i] = true;
        }
        bool flag = true;
        sort(b + 1, b + 1 + n);
        for (int i = 2; i < n; i++) {
            if (check[i] == false) {
                if (a[i] != b[i]) {
                    flag = false;
                    break;
                }
           }
        }
        if (flag)cout << "YES\n";
        else cout << "NO\n";
        for (int i = 1; i <= n; i++)check[i] = false;
    }
}

레이팅 변화 : 

1603 -> 1550 (-53)

민트가 되었다.

 

 

자세한 설명에 중점을 두기보다는 대회 기록에 중점을 둔 글입니다 !

틀린 부분은 감사히 지적받겠습니다.