spadyのメモ帳

技術ブログにしたいけどどうなることやら。まだ素人

ABC149(unrated)の参加記

A問題 Strings

そのまま。問題文読んで順番気をつければいい。

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

int main(){
    string s,t;
    cin >> s >> t;
    cout << t << s << endl;
    return 0;
}

B問題 Greedy Takahashi

問題文から考えられるのは以下の3通り

  • 高橋くんも青木くんも食べ残す
  • 青木くんだけ残る
  • 高橋くんに食べ尽くされる

だからそれを場合分けして書いた。

制約が1012までであることに注意

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

int main(){
    ll a,b,k;
    cin >> a >> b >> k;
    //場合分け
    if(k <= a){//高橋くんも青木くんも余る
        a -= k;
        cout << a << " " << b << endl;
    }else if (k >= a+b)//青木くんだけ余る
    {
        cout << 0 << " " << 0 << endl;
    }else{//食べ尽くされる
        cout << 0 << " " << (a+b)-k << endl;
    }
    return 0;
}

C問題 Next Prime

どこからか素数の判定する関数持ってきてfor回すだけ

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

bool IsPrime(int num)//素数だけ数えればいいから
{
    if (num < 2) return false;
    else if (num == 2) return true;
    else if (num % 2 == 0) return false; // 偶数はあらかじめ除く
    double sqrtNum = sqrt(num);
    for (int i = 3; i <= sqrtNum; i += 2)
    {
        if (num % i == 0)
        {   // 素数ではない
            return false;
        }
    }
    // 素数である
    return true;
}

int main(){
    int x;
    cin >> x;
    for(int i=x;;i++){
        if(IsPrime(i)){
            cout << i;
            break;
        }
    }
    return 0;
}

D問題 Prediction and Restriction

 今回は勝ったときだけポイントが入って、あいこと負けは0ポイントであるとこと、問題文が貪欲法を押している気がしたので貪欲法で書いてます。多分。初めて書いた貪欲法なのでこれが貪欲法なのか怪しいです。

​ k回前と同じ手をだせないということで何を出しても0ポイントで、2k回目のときにkで置き換えたものと同じになったときに面倒なので、あり得ない文字を結果に入れてます。

​ int型からあふれるのに気づかないで2WA出したのが残念。

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

char janken(char c){
    if(c == 'r'){
        return 'p';
    }else if (c == 's')
    {
        return 'r';
    }else if(c == 'p'){
        return 's';
    }else{
        return 0;
    }
}

int main(){
    ll n,k,r,s,p;
    cin >> n >> k >> r >> s >> p;
    string t;
    cin >> t;
    vector<char> result;
    ll total_score = 0;
    for(int i=0;i<n;i++){
        if(i < k){//k回まで
            result.push_back(janken(t[i]));
            if(janken(t[i]) == 'r'){
                total_score += r;
            }else if (janken(t[i]) == 's')
            {
                total_score += s;
            }else{
                total_score += p;
            }
        }else{
            if(janken(t[i]) != result[i-k]){
                result.push_back(janken(t[i]));
                if(janken(t[i]) == 'r'){
                    total_score += r;
                }else if (janken(t[i]) == 's')
                {
                    total_score += s;
                }else{
                    total_score += p;
                }
            }else{
                result.push_back('0');
                total_score += 0;
            }
        } 
    }
    cout << total_score;
    return 0;
}

/*
やっほい!
       やほほい!
    +    *
    ∧∧  . ∧∞∧ *
* ヽ(=´ω`)人(´ω`*)ノ
 .~( O x.) (   O)~ +
。*   ∪    ∪
*/

今回の感想

なんか簡単と言われた前回のABCより解けました。というより初Dだったので嬉しかったのですがratedだったらもっと嬉しかったです。