[2階]1.スキルツリー、機能開発、無傷の矩形


以下のすべての問題はプログラマから提供されています.ありがとうございます.
  • 全て解決
  • 1.スキルツリー


    問題の説明


    先行スキルとは、あるスキルを学ぶ前に学ばなければならないスキルです.
    例えば、現在スキル順が「スパーク」→「発光ボルト」→「カッター」の場合、学習カッターはまず「発光ボルト」を学び、「発光ボルト」はまず「スパーク」を学ぶ.
    以上の手順にない他のスキル(癒しなど)は順番に学ぶことができます.そのため、スパーク→癒し→ハイライトボルト→メスなどのスキルツリーを使用することは可能ですが、メス→スパークまたはハイライトボルト→スパーク→癒し→メスなどのスキルツリーを使用することは不可能です.
    先行スキル順スキルとプレイヤーが作成したスキルツリー1の配列スキルtreeをパラメータとして付与する場合は、できるだけスキルツリーの個数を返すsolution関数を書き出します.

    せいげんじょうけん

  • スキルはアルファベット大文字でマークされ、すべての文字列はアルファベット大文字のみで構成されています.
  • スキル順序とスキルツリーは文字列で表されます.
  • 例えば、C→B→Dの場合、「CBD」と表記する.
  • 前置技能順序技能の長さは1以上26以下であり、技能は繰り返してはならない.
  • skill treesは、長さが1または20未満の配列である.
  • skill treesの要素は、スキルを表す文字列です.
  • skill treesの要素は、2または26より長い文字列であり、このスキルは繰り返しません.
  • I/O例



    に答える

    #include <string>
    #include <vector>
    
    using namespace std;
    
    int solution(string skill, vector<string> skill_trees) {
        int answer = 0;
        int skill_pos = 0;
        int flag = 0;
        for (int i = 0; i < skill_trees.size(); i++)
        {
            skill_pos = 0;
            flag = 0;
            for (int j = 0; j < skill_trees[i].size() && flag != -1; j++)
            {
                for (int z = 0; z < skill.size() && flag != -1; z++)
                {
                    if(skill[z] == skill_trees[i][j])
                    {
                        if(z == skill_pos)
                        {
                            skill_pos += 1;
                        }
                        else
                            flag = -1;
                    }
                }
            }
            if (flag == 0)
                answer += 1;
        }
        return answer;
    }

    説明:

  • skillの値はskill treeに順番に書くことができ、順番に現れなければカウンタを避けるために論理を設計した.
  • 2.機能開発


    問題の説明


    プログラマチームは機能強化を実行しています.各機能は、進捗が100%の場合にサービスに反映されます.
    また、各機能の開発速度が異なるため、後の機能は前の機能の開発より先に、後の機能は前の機能の導入時に一緒に導入される可能性があります.
    まず、ソリューション関数を完了し、特定の整数配列の進捗状況(必要に応じて配置される順序)と整数配列速度(タスクごとの開発速度)のときに、各配置にどれだけの機能があるかを返します.

    せいげんじょうけん

  • タスクの数(進捗、速度配列長)は100を超えません.
  • 作業の進捗は100の自然数を下回っています.
  • の動作速度は100以下の自然数である.
  • 導入では、1日に1回しか導入できないと仮定し、1日の終了時に導入します.たとえば、開発速度が1日4%(95%)のタスクの場合、導入は2日後に完了します.
  • I/O例



    に答える

    #include <string>
    #include <vector>
    
    using namespace std;
    
    vector<int> solution(vector<int> progresses, vector<int> speeds) {
        vector<int> answer;
        vector<int> tmp = speeds;
        int sp_i = 0;
        int save;
        while (sp_i < speeds.size())
        {
            save = 0;
            for (int i = sp_i; i < speeds.size(); i++)
            {
                if (progresses[i] == 0)
                {
                    sp_i += 1;
                    save += 1;
                }
                else
                    break;
            }
            if (save != 0)
                answer.push_back(save);
            for (int j = sp_i; j < speeds.size(); j++)
            {
                if (progresses[j] < 100)
                    progresses[j] += tmp[j];
                else
                {
                    tmp[j] = 0;
                    progresses[j] = 0;
                }
            }
        }
        return answer;
    }

    説明:

  • では、インデックスの動作が100%完了すると、for構文により、インデックスと後続のインデックスが動作することを保証するために、それぞれfor構文が論理を完了するインデックスが作成されます.
  • 3.無傷の長方形


    問題の説明


    長方形の紙があり、幅はWcm、長さはHcmです.紙には水平方向と垂直方向に平行なグリッド線があり、すべてのグリッドは1 cm x 1 cmの大きさです.1 cm(グリッドに沿って)× 1センチの正方形に切るつもりだったが、この紙を2つの対角線の頂点を結ぶ方向に切った人がいた.したがって、現在の矩形紙は、同じ大きさの2つの直角三角形に分かれています.新しい用紙が見つからないため、この用紙の横方向と縦方向は元の用紙と平行1 cmである× 1 cmに切って、使えるだけ使ってください.
    横方向長さWと縦方向長さHが与えられた場合、使用可能な正方形の個数を求める解法関数を完了する.
    코드를 입력하세요

    せいげんじょうけん

  • ワット、H:1億以下の自然水
  • I/O例



    に答える

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    
    long long solution(int w, int h) {
        long long answer = 1;
        long long max = (long long)(w * h);
        double ww = (double)w;
        double hh = (double)h;
        double aw =  ww/hh;
        double ah = hh/ww;
        int sum = 0;
        double sum_w = ww/hh;
        double sum_h = hh/ww;
        double tmp;
    
        while(sum_w <= ww && sum_h <= hh)
        {
            if(sum_w < sum_h)
            {
                sum_w += aw;  // 8/12
                
            }
            else if(sum_h < sum_w)
            {
                sum_h += ah; // 12/8
            }
            else
            {
                sum_h += ah;
                sum_w += aw;
            }
            sum++;
        }
        max = max -(long long)sum;
        return max;
    }

    説明:

  • と対角線が重ならない部分まで数えておけばいいです.
  • が傾くと、下降または上昇を利用して、色を塗ったブロックのみが計算される.