[BOJ/C+]#1700マルチタブスケジューリング



グリディはもう2つの問題を解くと私をクビにしたと言った.
この問題で思い違いをしたので,時間はすぐに過ぎてしまった.🥲.

問題を解く


この問題の核心は、プラグを抜くとき
これから一度も使わない器具、あるいは最後に使う器具を選びます.
  • 使用順(K番)を順番に並べます.
  • は、
  • Kを返します.
  • 現在プラグに差し込んでいますか->抜く必要はありません.
  • に進みます.
  • プラグが空であるかどうか->空席を挿入し、
  • に進みます.
  • 1,2番はすべてではありません->プラグを抜かなければなりません.
  • はとても近いです!
  • 残りの注文のうち、以降1回も使用しない、または最後に使用したデバイス.
  • ミス

  • 最初は、N-1個とも挿すことができると思っていたので、挿しました.リピートがあるかも^^;
  • 抜くものを見つけたら、プラグに2,1を差し込んで、残りの順番は
    3、2、2、1、2の場合、最後に使うのは1です.ほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほほ
  • コード#コード#

    #include <iostream>
    using namespace std;
    
    int cnt=0;
    int N, K;
    int order[101], plugs[101];
    
    int main(){
    
        cin>>N>>K;
    
        for(int i=0;i<K;i++){
           cin>>order[i];
        }
    
        //사용횟수 <= 멀티탭 구멍 개수
        if(K<=N){
            cout<<0<<"\n";
            return 0;
        }
    
        //<실수1🥲> 0~N-1까지 그냥 넣으면 안 됨 . 거기서도 중복 있을 수 있음..
    
        for(int i=0;i<K;i++){
            bool isPlugged=false;
            //현재 플러그에 꼽혀있나
            for(int j=0;j<N;j++){
                if(order[i]==plugs[j]) {
                    isPlugged=true;
                    break;
                }
            }
    
            if(isPlugged) continue;
    
    
            // 비어있는지 확인
            for(int j=0;j<N;j++){
                if(!plugs[j]){
                    plugs[j]=order[i];
                    isPlugged=true;
                    break;
                }
            }
    
            if(isPlugged) continue;
    
    
            // 현재 플러그에 없으면 뭘 뽑아야할지 골라야 함
            // 플러그에 있는 것중 가장 나중에 사용하는 것 제거 (또는 아예 사용되지 않는 것)
            int plugsIdx; //뽑을 플러그 인덱스
            int max=-1;
    
            for(int j=0;j<N;j++){
                int lastIdx=-1;
                for(int k=i+1;k<K;k++){
                    if(plugs[j]==order[k]){
                        lastIdx=k;
                        break; // <실수1🥲> 중복되면 가장 최근에 쓰이는 걸로 찾아야됨....
                    }
                }
    
                if(lastIdx==-1){ //사용된 적 없으면
                    plugsIdx=j;
                    break;
                }
    
                if(lastIdx>max){
                    plugsIdx=j;
                    max=lastIdx;
                }
            }
            //뽑기
            plugs[plugsIdx]=order[i];
            cnt++;
        }
    
        cout<<cnt<<"\n";
        return 0;
    }

    もう寝る時間だ