2019Hdu 다중 학교 세번째 : 1007 대답 (MULTISET 솔루션을) 찾기

원래의 질문에 링크 : 대답에서 찾기

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 대답 찾기에

추천

출처www.cnblogs.com/zoom1109/p/11274948.html