[BOJ/C+]#1700マルチタブスケジューリング
グリディはもう2つの問題を解くと私をクビにしたと言った.
この問題で思い違いをしたので,時間はすぐに過ぎてしまった.🥲.
問題を解く
この問題の核心は、プラグを抜くとき
これから一度も使わない器具、あるいは最後に使う器具を選びます.
ミス
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;
}
もう寝る時間だ
Reference
この問題について([BOJ/C+]#1700マルチタブスケジューリング), 我々は、より多くの情報をここで見つけました https://velog.io/@inryu/BOJ-C-1700-멀티탭-스케쥴링テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol