因为要求总功率最小,所以按功率从小到大枚举已有的灯泡,尽量使用先使用小的,然后贪心选取第一个小于等于这个功率的房间,让后将差值放入堆中,用来最后更新答案,如果到最后时仍然有
>=k
的数量的灯泡没用则无解,否则就有解
都说用STL来水题..怎么感觉题并不水..
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<iostream>
#define N 500050
#define inf -111111111
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i*f;
}
priority_queue<int,vector<int> >q;
multiset<int>st;
int n,k,p[N],w[N],tot;
long long sum;
int main()
{
n=sc(),k=sc();
for(int i=1;i<=n;i++)p[i]=sc();
for(int i=1;i<=n;i++)w[i]=sc(),st.insert(w[i]);
sort(p+1,p+n+1);
st.insert(inf);
for(int i=1;i<=n;i++)
{
int x=*--st.upper_bound(p[i]);
if(x==inf)tot++;
else
{
sum+=p[i];
q.push(p[i]-x);
st.erase(st.find(x));
}
}
//cout << sum << " "<< tot <<endl;
if(tot>k){puts("NIE");return 0;}
for(multiset<int>::iterator it=st.begin();it!=st.end();it++)
k--,sum+=*it;sum-=inf;k++; //cout << sum << " "<< k<<endl;
while(k--&&!q.empty())sum-=q.top(),q.pop();
cout<<sum<<endl;
return 0;
}