PA2014-Final Zarowki(堆)

匿名 (未验证) 提交于 2019-12-03 00:13:02

题目描述

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无解
  • 不能直接贪心扫两遍换,因为原来有的其他灯泡可能 能够解决(看样例
  • (接第三条) 所以要把能够解决问题的所有灯泡都放进答案里
#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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!