LoginSignup
0
0

More than 3 years have passed since last update.

AtCoder Beginner Contest 171におじさんが挑戦しました

Posted at

はじめに

今回、AtCoderに初めて挑戦しました。
結果は6問中惨敗でした。
今までの軌跡はこちらにまとめています。
本家の解説はこちらです。

αlphabet

問題はこちら
これに対して自分の回答は以下です。

#include<iostream>

using namespace std;

int main()
{
    char a, b, c;
    cin >> a;

    if(90 >= a && a >= 65)
        cout << 'A' << endl;
    else if(122 >= a && a >= 97)
        cout << 'a' << endl;

    return 0;
}

大文字と小文字は文字コードが連続しているので、それで判別しています。

本家の解説ではPythonでislower関数を使って、数行で済ませていました。
なんか、悔しいですね。
短い時間でコーディング量を減らすには、ある程度ライブラリ類を覚えておく必要がありますね。

Mix Juice

問題はこちら
これに対して自分の回答は以下です(不正解ですが・・・)。

#include<iostream>
#include<cmath>
#include <cstring>

using namespace std;

int main()
{
    int n, k;

    cin >> n >> k;

    int* vals = new int[n];
    int* comb = new int[k];
    int tmp_val;
    int min = 1000 * 1000;
    int pattern = pow(n, k);

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

    for(int i = 0; i < pattern; i++)
    {
        int tmp = i;
        tmp_val = 0;
        for(int j = 0; j < k; j++)
        {
            comb[j] = tmp % n;
            tmp_val += vals[comb[j]];
            tmp /= n;
        }

        bool flag = false;
        for(int j1 = 0; j1 < k ; j1++)
        {
            for(int j2 = 0; j2 < k; j2++)
            {
                if(j1 == j2) continue;
                if(comb[j1] == comb[j2])
                {
                    flag = true;
                    break;
                }
            }
            if(flag) break;
        }
        if(flag) continue;

        if(min > tmp_val)
        {
            min = tmp_val;
        }
    }

    cout << min << endl;
    return 0;
}

コードが長いですね。
いい方法が思いつかず、全探索しています。
解説みると先にソートしてますね。言われてみれば確かに!という感じです。
ちなみに不正解の理由はよくわかってません・・・

One Quadrillion and One Dalmatians

問題はこちら
これに対して自分の回答は以下です(不正解ですが・・・)。

#include<iostream>
#include<sstream>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    char c_base = 97;
    stringstream name;

    cin >> n;
    int tmp = n - 1;

    while(tmp >= 26)
    {
        char c = tmp % 26;
        tmp /= 26;
        name << (char)(c_base + c);
    }

    char c = tmp % 26;
    name << (char)(c_base + c - 1);

    string name2 = name.str();
    reverse(name2.begin(), name2.end());
    cout << name2 << endl;;

    return 0;
}

26進数の問題ですね。
方向性は解説と一致していると思います。
ただ、自分の回答は桁上がりの前後で思った値にならず、不正解となっています。
落ち着けばすぐ直せたと思いますが、残り時間が少なくなるとパニックになりますね・・・

残り

  • Replacing
  • Red Scarf
  • Strivore

回答できず!

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0