3728: PA2014Final Zarowki set+priority_queue

人太弱不会用stl,于是开学第一天决定水上一天stl玩一玩。

这题我们首先可以贪心的让当前有的灯泡都尽量满足,若剩下的 >k 则无解, =k 则正好, <k 则我们可以舍弃部分当前灯泡来换取更优的灯泡。于是用一个set和一个priority_queue一起来维护。

#include<iostream>
#include<cstdio>
#include<queue>
#include<set>
#include<algorithm>
#define ll long long 
using namespace std;
int n,k,p[500005],w[500005];
ll ans;
multiset<int> s;
priority_queue<int,vector<int> >q;
inline int read()
{
    int a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    n=read(); k=read();
    for (int i=1;i<=n;i++) p[i]=read();
    for (int i=1;i<=n;i++) w[i]=read();
    sort(p+1,p+n+1);
    for (int i=1;i<=n;i++) s.insert(w[i]);
    for (int i=1;i<=n;i++)
    {
        multiset<int>::iterator it;
        it=s.upper_bound(p[i]);
        if (it!=s.begin())
        {
            it--;
            q.push(p[i]-*it);
            s.erase(it);
            ans+=p[i];
        }
    }
    if (s.size()>k) {puts("NIE"); return 0;}
    multiset<int>::iterator it;
    for (it=s.begin();it!=s.end();it++)
    {
        k--;
        ans+=*it;
    }
    while (k--) {ans-=q.top(); q.pop();}
    cout << ans << endl;
    return 0;
}

你可能感兴趣的:(3728: PA2014Final Zarowki set+priority_queue)