zoukankan      html  css  js  c++  java
  • 【BZOJ3728】【PA2014】—Final Zarowki(思维题)

    传送门

    考虑对于每一个房间,肯定是选择差最小的那个灯泡
    而如果满足的灯泡不够了就需要换一个过来
    最后如果还有剩下可以换的肯定是要把差最大的给换掉

    那就有个大致的做法了

    将房间和灯泡从大到小排序
    维护一个堆表示比当前房间大的剩下还可以用的灯泡
    如果还有剩的就选一个最小的,并将他们的差再放入一个堆里面
    没有的话就花一次机会换一个灯泡过来

    最后如果有剩下的机会再换差最大的几对

    #include<bits/stdc++.h>
    using namespace std;
    const int RLEN=1<<20|1;
    #define ll long long
    inline char gc(){return getchar();
    	static char ibuf[RLEN],*ib,*ob;
    	(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
    	return (ib==ob)?EOF:*ib++;
    }
    inline int read(){
    	char ch=gc();
    	int res=0,f=1;
    	while(!isdigit(ch))f^=(ch=='-'),ch=gc();
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
    	return f?res:-res;
    }
    const int N=500005;
    priority_queue<int,vector<int>,greater<int> >f1;
    priority_queue<int>f2;
    int n,k,a[N],b[N];
    ll ans;
    int main(){
    	n=read(),k=read();
    	generate(a+1,a+n+1,read);
    	generate(b+1,b+n+1,read);
    	sort(a+1,a+n+1);
    	sort(b+1,b+n+1);
    	for(int i=n,j=n;j;j--){
    		for(;i&&b[j]<=a[i];i--){
    			f1.push(a[i]);
    		}
    		if(!f1.size()){
    			k--,ans+=b[j];
    			if(k==-1){
    				puts("NIE");return 0;
    			}
    		}
    		else{
    			int x=f1.top();f1.pop();
    			ans+=x,f2.push(x-b[j]);
    		}
    	}
    	while(k--)ans-=f2.top(),f2.pop();
    	cout<<ans;
    }
    
  • 相关阅读:
    CSS3单选动画
    CSS3不一样的下拉选择框
    CSS3实现3d菜单翻转
    CSS3实现加载数据动画2
    CSS3实现加载数据动画1
    MySQL事务隔离级别和Spring事务关系介绍(转载)
    Elasticsearch7.5&Kibana7.5安装
    用nginx实现https请求转http请求(转)
    elasticsearch中多个字段聚合两种方法介绍
    window 同时安装python2和python3
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145575.html
Copyright © 2011-2022 走看看