首页 > 其他 > 详细

PA2014-Final Zarowki(堆)

时间:2019-10-04 10:02:06      阅读:82      评论:0      收藏:0      [点我收藏+]

题目大意 

题目描述

n 个房间和 n 盏灯,你需要在每个房间里放入一盏灯。每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮。 你可以去附近的商店换新灯泡,商店里所有正整数功率的灯泡都有售。但由于背包空间有限,你至多只能换 k 个灯泡。 你需要找到一个合理的方案使得每个房间都被完全照亮,并在这个前提下使得总功率尽可能小。

输入格式

从标准输入读入数据。

第一行两个整数 n,k 1 \le k \le n \le 5\times 10^5 )。 第二行n个整数 p_i 1 \le p_i \le 10^9 ),表示你现有的灯泡的功率。 第三行n个整数 w_i 1 \le w_i \le 10^9 ),表示照亮每间房间所需要的最小功率。

输出格式

输出到标准输出。

如果无法照亮每间房间,仅输出 NIE。 否则输出最小的总功率。

样例1输入

6 2
12 1 7 5 2 10
1 4 11 4 7 5 

样例1输出

33

提示

对于样例1,将2和10换成4和4。配对方案为1-1,4-4,4-4,5-5,7-7,11-12。

解题报告

  • (题意)拥有的灯泡功率必须大于等于需要的,有k次机会换拥有的功率
  • 换的次数少于 需要换的灯泡数 时,输出NIE无解
  • 并不是一一对应的关系,因为这个灯泡可能其他拥有的的灯泡满足,而功率数可能更小; 也有可能没有灯泡可以给他用;
  • 所以我们应当把能满足大功率灯泡中较小功率的灯泡给大需求用户,而不是给一个需求量更小的灯泡(如样例中(拥有)7应该给(需求)7而不应该给(需求)5)
  • “小的灯泡能用则用,不能用的保留。”
  • 技术分享图片
技术分享图片
#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;
}
View Code

 

PA2014-Final Zarowki(堆)

原文:https://www.cnblogs.com/phemiku/p/11621369.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!