グリディの解題


😊 冒険者ギルド

#include <bits/stdc++.h>

using namespace std;

int n;
vector<int> arr;

int main(void) {
    cin >> n;

    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        arr.push_back(x);
    }

    sort(arr.begin(), arr.end());

    int result = 0; // 총 그룹의 수
    int count = 0; // 현재 그룹에 포함된 모험가의 수

    for (int i = 0; i < n; i++) { // 공포도를 낮은 것부터 하나씩 확인하며
        count += 1; // 현재 그룹에 해당 모험가를 포함시키기
        if (count >= arr[i]) { // 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
            result += 1; // 총 그룹의 수 증가시키기
            count = 0; // 현재 그룹에 포함된 모험가의 수 초기화
        }
    }

    cout << result << '\n'; // 총 그룹의 수 출력
}

😊 乗算または加算

#include <bits/stdc++.h>

using namespace std;

string str;

int main(void) {
    cin >> str;

    // 첫 번째 문자를 숫자로 변경한 값을 대입
    long long result = str[0] - '0';

    for (int i = 1; i < str.size(); i++) {
        // 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행
        int num = str[i] - '0';
        if (num <= 1 || result <= 1) {
            result += num;
        }
        else {
            result *= num;
        }
    }

    cout << result << '\n';
}

😊 反転文字列

#include <bits/stdc++.h>

using namespace std;

string str;
int count0 = 0; // 전부 0으로 바꾸는 경우
int count1 = 0; // 전부 1로 바꾸는 경우

int main(void) {
    cin >> str;

    // 첫 번째 원소에 대해서 처리
    if (str[0] == '1') {
        count0 += 1;
    }
    else {
        count1 += 1;
    }

    // 두 번째 원소부터 모든 원소를 확인하며
    for (int i = 0; i < str.size() - 1; i++) {
        if (str[i] != str[i + 1]) {
            // 다음 수에서 1로 바뀌는 경우
            if (str[i + 1] == '1') count0 += 1;
            // 다음 수에서 0으로 바뀌는 경우
            else count1 += 1;
        }
    }

    cout << min(count0, count1) << '\n';
}

😊 作成できない金額


コードの説明


たとえば、1、2、3、5元の単位を持つ場合は、まず1、2、3元
1 = 1
2 = 2
3 = 3
4 = 1+3
5 = 2+3
6 = 1+2+3
つまり1+2+3=6元でもできます.
ここから5元以上入ったら.
1+5 , 2+5 , 3+5, ... , (ブロック問題に類似)1+2+3+5=11元.
でも1,2,3,8元の単位硬貨があれば
1+2+3=6以降は7元は作れません.すなわち,target(単位)を増やし続け,持つ単位より小さくすれば最適解を求めることができる.
#include <bits/stdc++.h>

using namespace std;

int n;
vector<int> arr;

int main(void) {
    cin >> n;

    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        arr.push_back(x);
    }

    sort(arr.begin(), arr.end());

    int target = 1;
    for (int i = 0; i < n; i++) {
        // 만들 수 없는 금액을 찾았을 때 반복 종료
        if (target < arr[i]) break;
        target += arr[i];
    }

    // 만들 수 없는 금액 출력
    cout << target << '\n';
}

😊 ボウリングを選ぶ


コードの説明


A、B二人がいるときは、Aを基準にしてcaseを分けます.
重さが1のボウリングが1つ、重さが2のボウリングが2つ、重さが3のボウリングが2つあるとしたら
(組み合わせなら、義手を考えてみます)
Case 1)Aが重量1の球を選ぶとき->
(A選択質量1の個数)1*4(B選択質量の場合)
Case 2)Aが重量2のボールを選ぶとき->
(A選択質量2の個数)2 2(B選択質量の場合)
ここで、2 3ではないのは、組み合わせにより算出された重量1を選択した場合を除きます.
case3 )
2*0=0種
全部で8種類あります.
#include <bits/stdc++.h>

using namespace std;

int n, m;
// 1부터 10까지의 무게를 담을 수 있는 배열
int arr[11];

int main(void) {
    cin >> n >> m;

    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        arr[x] += 1;
    }

    int result = 0;

    // 1부터 m까지의 각 무게에 대하여 처리
    for (int i = 1; i <= m; i++) {
        n -= arr[i]; // 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
        result += arr[i] * n; // B가 선택하는 경우의 수와 곱해주기
    }

    cout << result << '\n';
}

😊 無知な食いしん坊生活


priority queueナビゲーションの使用
=>再学習