멀티탭에 k개 이상 꽂아야하는 순간 하나를 뽑는다. 뽑아야할 녀석은 가장 나중에 사용되는 플러그부터 뽑는다. 그런게 없다면 아무거나 뽑는다.
#include <bits/stdc++.h> using namespace std; int main(){ int n, k; scanf("%d %d", &k, &n); vector<int> v(n); for(int i=0; i<n; ++i) scanf("%d", &v[i]); int ret = 0, idx = 0; vector<bool> pluged(101, false); int curK = 0, lastPush = v.front(); for(int i=0; i<n; ++i){ if(pluged[v[i]]) continue; curK += 1; if(curK > k){ vector<int> lastUse(101, n); int cand = -1, maxD = -1; for(int j=0; j<i; ++j){ if(!pluged[v[j]]) continue; for(int k=i+1; k<n; ++k){ if(v[j] == v[k]){ lastUse[v[j]] = k; break; } } if(maxD < lastUse[v[j]]){ maxD = lastUse[v[j]]; cand = v[j]; } } if(cand == -1) cand = lastPush; //printf("push:%d, then pop: %d\n", v[i], cand); ret += 1; pluged[cand] = false; } lastPush = v[i]; pluged[v[i]] = true; } printf("%d", ret); return 0; }
댓글 없음:
댓글 쓰기