원래의 질문에 링크 : 대답에서 찾기
C ++에서, MULTISET는 매우 유용한 타입 라이브러리이며,이 숫자를 삽입 번호를 삭제, 순서로 볼 수있다은 시간 O (logn)에 완료 할 수 있으며, 순서는 그는 항상 수를 보장 할 수 시퀀스 및 반복의 시퀀스 번호가 존재할 수있다.
자세한 내용은 다음을 참조하십시오 MULTISET 사용 요약
문제 해결 아이디어를 : 1007를 들어 숫자 X를 넣어이 질문에, 판사을 시뮬레이션하고, 합법적, 다음을 삭제, 왜 삭제 될 수없는 숫자 인 경우 다음 순서, 법적 판단을 삽입 할 수 있습니까? 다수의 불법 판단되는 경우 때문에, 그 다음 그는 더 이상 사용할 수있다.
다음과 같이 코드입니다 :
#include<set>
#include<iostream>
using namespace std;
typedef long long ll;
multiset<int> st;
ll sum;
void erase(ll x){
st.erase(st.find(x));
sum -= x;
}
void insert(ll x){
st.insert(x);
sum += x;
}
void solve(){
sum = 0;
st.clear();
int n, m, tot = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
int x, num = 0;
scanf("%d", &x);
auto it = st.end();
ll tmp = sum;
while(tmp + x > m){
it--;
tmp -= (*it);
num++;
}
printf("%d ", tot + num);
insert(x);
while(sum > m){
auto it = st.end();
it--;
erase((*it));
tot++;
}
}
printf("\n");
}
int main(){
int t;
scanf("%d", &t);
while(t--){
solve();
}
return 0;
}
참조 : HDU 6609 대답 찾기에