- 이지에서는 오버플로우땜에 틀리고
- 미듐에서는 두가지 삽질을 했는데... 하나는 필요도 없는 마지막에 본 영화를 상태 공간에 넣어서 시간 안에 짜려고 개삽질을 한 것이고.. 두 번째는 영화는 끝까지 다봐야 쳐주는건데 그걸 신경 안쓴 것이고..
어젯밤에 연애시대 다시 정주행하느라고 잠을 못자서 이런 것이라고 위로해본다 orz
오랜만에 C++
250
lang:cpp
class TheMoviesLevelOneDivOne
{
public:
long long find( int n, int m, vector <int> row, vector <int> seat )
{
ll ret = 0;
map<int,VI> rows;
REP(i,row.sz) rows[row[i]].pb(seat[i]);
ret += ll(n - rows.sz) * ll(m - 1);
FORE(it,rows) {
VI& seats = it->second;
seats.pb(0); seats.pb(m + 1);
sort(all(seats));
REP(i,seats.sz-1) {
int span = seats[i+1] - seats[i] - 1;
ret += max(span-1, 0);
}
}
return ret;
}
};
500
lang:cpp
int cache[1<<20], choice[1<<20];
class TheMoviesLevelTwoDivOne
{
public:
VI L, S;
int N;
int maxWatch(int watched) {
int& ret = cache[watched];
if(ret != -1) return ret;
ret = 0;
int& ch = choice[watched];
int level = 74;
REP(i,N) if(watched&(1<<i)) level += 47 - L[i];
REP(i,N) if((watched&(1<<i)) == 0) {
if(level >= S[i] && level + 47 >= L[i]) {
int cand = maxWatch(watched + (1<<i)) + 1;
if(cand > ret) {
ret = cand;
ch = i;
}
}
}
return ret;
}
void reconstruct(int watched, VI& sol) {
if(maxWatch(watched) == 0) {
REP(i,N) if((watched & (1<<i)) == 0) {
sol.pb(i);
}
return;
}
sol.pb(choice[watched]);
reconstruct(watched + (1 << choice[watched]), sol);
}
vector <int> find( vector <int> length, vector <int> scary )
{
L = length;
S = scary;
N = L.sz;
VI ret;
CLEAR(cache,-1);
reconstruct(0, ret);
return ret;
}
};
하드는 안드로 'ㅅ'*


