プログラムプリンタ


マジシャンです


一般的なプリンタでは、必要な印刷順に印刷されます.したがって、重要なドキュメントは後で印刷される可能性があります.この問題を解決するために,重要文書を先に印刷するプリンタを開発した.この新しく開発されたプリンタは、次のように印刷されます.
印刷待ちリスト
  • から、先頭の文書(J)を取り出す.
  • 残りの
  • 個の印刷対象リストにJよりも重要なドキュメントがある場合は、Jを印刷対象リストの最後に配置します.
  • でなければJを印刷します.
  • 例えば、4つの文書(A、B、C、D)が印刷対象リストに順次存在し、重要度が2 1 3 2の場合、CD A Bの順に印刷される.
    私が印刷を要求したドキュメントが何回目の印刷なのか知りたいです.上記の例では、Cは1位、Aは3位である.
    ソリューション関数を作成してください.パラメータが現在のキュー・リスト内のドキュメントの重要度のソート順と、印刷を要求したドキュメントが現在のキュー・リスト内にある場所を指定した場合、印刷を要求したドキュメントの何回目の印刷かを返します.
    せいげんじょうけん
  • 現在の待機リストには、1つ以上の100個のドキュメントが含まれています.
  • 印刷ジョブの重要性は1から9で表され、数字が大きいほど重要である.
  • の位置の値は0より大きく(現在のキューリストのタスク数-1)、キューリストの先頭に0、2番目の位置に1と表示されます.
  • 方法


    整理すると、
    この問題では,数字が大きい方が優先順位が高い.また、プリンタ待ちリストもゼロから計算を開始します.
    最上位のドキュメントより優先度が高いドキュメントが残りの待機リストにある場合は、最上位のドキュメントを最背面に送信します.
    一番前のドキュメントが削除されて戻ってくるので、Qを初めて思い出しました.
    ただし、比較の参照が必要な待機リストで優先度の高いドキュメントを検索する必要がありますが、キューは参照できません...!そこでデックを思い出した.
  • 一番前の書類より順位の高いやつを探しています.あるかどうか教えてくれればいいのに.
  • 自分より大きいやつがいなければ一番前のポップを引くたびに
  • と数えます
  • 1,2回繰り返しのうち、指数が浮動小数点数と等しい場合は破られ、
  • に戻る.
    #include <string>
    #include <vector>
    #include <deque>
    
    using namespace std;
    struct Mypair{int val, index;}; //문서의 이름, 문서의 index
    deque <Mypair> waitList;
    bool prioritycheck(){ //우선순위 높은게 있는지 확인
        if(waitList.size() == 1) return false;
        for(int i = 1; i < waitList.size(); i++)
            if(waitList[0].val < waitList[i].val) return true;
        return false;
    }
    
    int solution(vector<int> priorities, int location) {
        int answer = 0;
        for(int i = 0; i < priorities.size(); i++){
            Mypair a;
            a.val = priorities[i];
            a.index = i;
            waitList.push_back(a);
        }
        while(1){
            if(waitList.empty()) break;
            if(prioritycheck()){// 순위 높은게 있다면 맨 뒤로 가장앞의 문서를 보내기
                waitList.push_back(waitList.front());
                waitList.pop_front();
            }else{//순위 높은게 없다면 앞의 문서를 출력해주는데(pop) 숫자를 세줘야함
                if(waitList.front().index == location){
                    answer++;
                    break;
                }else{
                    waitList.pop_front();
                    answer++;
                }
            }
        }
        return answer;
    }