[Programmers](高得点KIT)Greedy-Joycastic


https://programmers.co.kr/learn/courses/30/lessons/42860#

問題の説明


JOYSTICでアルファベット名を完成最初はAのみで構成されていました
ex)完成する名前は3文字AAA、4文字AAAAAA
JOYロッドを各方向に移動し、以下のようにします.
▲-次の文字
▼-前の文字(AからZへ下へ)
◀-カーソルを左に移動します(最初の位置から最後の文字にカーソルを左に移動します).
▶-カーソルを右に移動(最後の位置から右に移動し、最初の文字上にカーソルを置く)
たとえば、次の方法でJAZを作成できます.
  • の1番目の位置でJOYロッドを9回上向きに操作し、Jを完了します.
  • レバーを1回左に移動し、最後の文字位置にカーソルを移動します.
  • の最後の位置で、JOYSTICを1回下に操作してZを完了します.
    したがって、11回移動して「JAZ」を作成することができます.これは最小の移動です.
    パラメータとして名前を作成する場合は、名前に対するJOYSTIC操作回数の最大値を返すソリューション関数を作成します.
  • せいげんじょうけん


    nameはアルファベットの大文字のみで構成されています.
    nameの長さは1または20以下です.

    I/O例


    namereturn"JEROEN"56"JAN"23

    Solution

    #include <string>
    #include <vector>
    
    using namespace std;
    
    int solution(string name) {
        int answer = 0;
        for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
        int len = name.length();
        int move = len - 1;
        for(int i = 0; i < len; i++){
            int next = i + 1;
            while(next < len && name[next] == 'A') next++;
            move = min(move, i + (len - next) + min(i, len-next));
        }
        answer += move;
        return answer;
    }
    for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
    すべてのビット数について,最小の移動回数を求めてから加算する.どうせどこに行ってもJOYSTIC移動
    int move = len - 1;
    for(int i = 0; i < len; i++){
        int next = i + 1;
        while(next < len && name[next] == 'A') next++;
        move = min(move, i + (len - next) + min(i, len-next));
    }
    answer += move;
    return answer;
    各インデックスを確認します.どの方向に移動するかを決めるプロセスです.
    原点からiに戻り、原点に戻り、len-nextの移動速度が速いか、原点からlen-nextに戻り、iに戻る移動速度が速いかを決定します.各位置確認後、最小値を移動すればよい.
    例えば、ABABAABAがあると仮定する.いずれにしても、いったんJOY STICを移動し始めると、元の文字に戻ることはありません.つまり、うまくいったとしても、迷うことはありません.

    iが1、nextが3の場合、iに戻ってそんなに遠く、それからlen-nextに戻るのはそんなに速いですか?原点からlen-nextまで、それからiに戻るのはそんなに速いですか?それともずっと歩いていくのがもっと速いですか?この三つの問題を考える.は、記事に存在するすべてのインデックスです.二つの文字を基準にしていますが、真ん中に挟まれた他の文字はどうせ通り過ぎるので、処理するかどうかにかかわらず、そうではないでしょうか.
    最初は上手に描かれている場合、どれが一番Aに近い文字ではないかを確認してから、1つずつ加算する方法を選びました.その方法はもちろん正しいかもしれませんが、どこが問題なのか、いつもいくつかのテストボックスを間違えているので、方法を変えました.