标签:代码 family a20 mil 关系 main opened img scanf
(题意)拥有的灯泡功率必须大于等于需要的,有k次机会换拥有的功率
换的次数少于 需要换的灯泡数 时,输出NIE无解
并不是一一对应的关系,因为这个灯泡可能其他拥有的的灯泡满足,而功率数可能更小; 也有可能没有灯泡可以给他用;
#include<bits/stdc++.h>
using namespace std;
#define fr(i,z) for(int i = 1; i <= z; i++)
const int N = 500500;
int n,k,j = 1;
int p[N],w[N];
long long ans;
priority_queue<int > t;
priority_queue<int,vector<int>,greater<int> > q;
bool cmp(int a,int b){return a>b;}
int main()
{
scanf("%d%d",&n,&k);
fr(i,n) scanf("%d",p + i);
fr(i,n) scanf("%d",w + i);
sort(p + 1, p + n + 1, cmp);
sort(w + 1, w + n + 1, cmp); //要从大到小比较,为了获得能满足要求的最小功率的灯泡
fr(i,n){
while(p[j] >= w[i]) q.push(p[j++]); //把可以满足的都扔进堆里
if(!q.empty()){
ans += q.top();
t.push(q.top() - w[i]); //要记下差值,以便后面换灯泡
q.pop();
continue;
}
k--; //计数,判断是否无解 以及 最后剩余的更改数
ans += w[i]; //如果确定要换,那肯定是换等于需求功率的
if(k < 0) { //判断无解
cout << "NIE";
return 0;
}
}
while(k--){
ans -= t.top(); //换的思路都是相同的
t.pop();
}
cout << ans;
}
标签:代码 family a20 mil 关系 main opened img scanf
原文地址:https://www.cnblogs.com/aprincess/p/11621574.html