【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3 -해설-

마지막 기사



AtCoder164에 가입한 내 결과를보고했습니다.
이번에는 제가 실제로 해답할 수 있던 ABC 3가지 문제에 대해 해설하고 싶습니다.
【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3

A문제: Sheep and Wolves



문제문 발췌


해설



두 개의 숫자를 비교하는 문제입니다.
양이 S마리, 늑대가 W마리 있는 경우에, 「늑대의 수가 양의 수 이상」 즉 「S<=W」가 되는 경우를 「unsafe」라고 합니다.

problemA.cpp
#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {

    int s,w;
    cin >> s >> w;

    if(s<=w)
        cout << "unsafe" << endl;
    else
        cout << "safe" << endl;

    return 0;
}

B문제: 배틀



문제문 발췌


문제를 읽으면 이런 이미지가 솟아나는 걸까 생각합니다.


카드 게임이라든가는 아마 이미지를 할 수 있다고는 생각합니다만,
이미지할 수 없는 사람은 이런 흐름으로 몬스터의 싸움이 반복됩니다.
싸움의 이미지





그림을 보신 분은 흐름을 이해할 수 있었습니까?
그림에 기재한 대로 자쿠토 이런 흐름입니다.

1. 타카하시군의 몬스터가 아오키군의 몬스터에 공격해, 체력을 줄인다(C-B)

2. 아오키군의 몬스터가 타카하시군의 몬스터에 공격해 체력을 줄인다(A-D)

3. 이 조작을 어느 쪽의 몬스터의 체력(A 혹은 C)이 제로가 될 때까지 반복한다

4. 반복한 결과, 타카하시군이 이긴 경우(즉 C가 제로가 된 경우)는 Yes를, 그렇지 않으면 No를 출력한다

problemB.cpp
#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {

    int a,b,c,d ;

    cin >> a >> b >> c >> d;

    while(a>=0 || c>=0){ //それぞれのモンスターの体力がゼロになるまで
        c = c-b; //高橋君の攻撃のターン
        if(c<=0){
            cout << "Yes" << endl;
            break; //勝敗が決まったのでループを抜ける
        }

        a = a-d; //青木君の攻撃のターン

        if(a<=0){
            cout << "No" << endl;
            break; //勝敗が決まったのでループを抜ける
        }

    }

    return 0;
}

C문제 : ​​가차



문제문 발췌


C문제에 대해서는 매번 문자열을 모든 검색에서 매칭하면 계산량의 관계로 실행시간 에러가 되는 것 같습니다.
따라서 아래와 같이 정렬 등으로 계산량을 줄이는 궁리가 필요합니다.
계산량에 대해서는 나도 어디까지라면 줄이면 좋다든가 정직 아직 이해할 수 없기 때문에,
자세한 설명은 삼가합니다.
※덧붙여서 나는 계산량이라든지 그다지 신경쓰지 않고, 이쪽이 간단하다-라고 생각하면 결과 잘 간 느낌이었습니다. . . 공부합니다.

problemC.cpp
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int main(int argc, const char * argv[]) {

    int n;

    cin >> n;

    string a[n+1];

    a[0] ="";    
    for(int i=1; i<=n; i++)
        cin >> a[i];

    sort(a,a+n+1); //配列の内容をソートして辞書順にする

    int cnt=0;

    for(int i=1; i<=n; i++){
        if(a[i-1]==a[i]) //同じものの場合にcntをインクリメントする
            cnt++;
    }

    cout << n-cnt << endl; //違うものの数を数えたいのでnからcntを引く

    return 0;
}

마지막으로



어땠습니까?
봐도 모르겠다고 좀 더 이렇게 하면 좋지 않을까? 같은 따뜻한 말 두시도시 기다리고 있습니다.

좋은 웹페이지 즐겨찾기