array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 bzoj2590[Usaco2012 Feb]Cow Coupons - 爱码网

题意

FJ准备买一些新奶牛,市场上有N头奶牛(1<=N<=50000),第i头奶牛价格为Pi(1<=Pi<=109)。FJ有K张优惠券,使用优惠券购买第i头奶牛时价格会降为Ci(1<=Ci<=Pi),每头奶牛只能使用一次优惠券。FJ想知道花不超过M(1<=M<=1014)的钱最多可以买多少奶牛?

分析

比别人多个log系列...
答案显然有可二分性.所以先二分答案m,求购买m头牛的最小花费.
考虑先确定买哪些奶牛再确定这些奶牛中哪些用优惠券.如果已经知道了买哪些奶牛,对于每一头牛使用优惠券的收益Pi-Ci是确定的,我们把Pi-Ci排个序,获得其中最大的k个收益即可.也就是说,最后一定是Pi-Ci较大的一些牛使用优惠券.
因此我们把n头奶牛按照Pi-Ci从小到大排序.对于最优方案,一定存在一个分界点使得分界点左侧的牛要么不选要么付出Pi的代价,分界点右侧的牛要么不选要么付出Ci的代价.
然后枚举分界点,维护分界点左侧最小的m-k个Pi和分界点右侧最小的k个Ci,就可以求出最小花费.我写了一发multiset.
复杂度\(O(nlog^{2}n)\)
终于学会multiset在存在多个相同元素时怎样只删除其中一个而不删除其他相同元素了,传迭代器进去即可

你可能看了假的C++选手写的题解

#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=50005;
int n,k;ll money;
ll p[maxn],c[maxn];
int seq[maxn];
bool cmpdlt(const int &a,const int &b){
  return p[a]-c[a]<p[b]-c[b];
}//left: p right: c
bool cmpc(const int &a,const int &b){
  return c[a]<c[b];
}
int seq2[maxn];
bool check(int m){
  if(m==0)return true;
  if(m<=k){
    long long sum=0;
    for(int i=1;i<=m;++i){
      sum+=c[seq2[i]];
    }
    return sum<=money;
  }else{
    ll ans=1ll<<60;
    int g=m-k;//g cows without coupon,k cows with coupon
    multiset<ll> lbuy,rbuy,lnot,rnot;
    ll lsum=0,rsum=0;
    for(int i=1;i<=g;++i){
      lsum+=p[seq[i]];
      lbuy.insert(p[seq[i]]);
    }
    int cnt=0;
    for(int i=g+1;i<=n;++i){
      if(cnt<k){
	rsum+=c[seq[i]];rbuy.insert(c[seq[i]]);
	++cnt;
      }else{
	if(c[seq[i]]<(*rbuy.rbegin())){
	  rsum-=(*rbuy.rbegin());
	  rsum+=c[seq[i]];
	  rnot.insert((*rbuy.rbegin()));
	  rbuy.erase(--rbuy.end());
	  rbuy.insert(c[seq[i]]);
	}else{
	  rnot.insert(c[seq[i]]);
	}
      }
    }
    ans=min(ans,lsum+rsum);
    for(int i=g+1;i<=n-k;++i){
      if(p[seq[i]]<(*lbuy.rbegin())){
	lsum-=*lbuy.rbegin();
	lbuy.erase(--lbuy.end());
	lsum+=p[seq[i]];lbuy.insert(p[seq[i]]);
      }
      if(rbuy.find(c[seq[i]])!=rbuy.end()){
	rsum-=c[seq[i]];
	rbuy.erase(rbuy.find(c[seq[i]]));
	rsum+=(*rnot.begin());rbuy.insert(*rnot.begin());
	rnot.erase(rnot.begin());
      }
      ans=min(ans,lsum+rsum);      
    }
    return ans<=money;
  }
}
int main(){
  scanf("%d%d%lld",&n,&k,&money);
  for(int i=1;i<=n;++i)scanf("%lld%lld",p+i,c+i);
  for(int i=1;i<=n;++i)seq[i]=i,seq2[i]=i;
  sort(seq+1,seq+n+1,cmpdlt);sort(seq2+1,seq2+n+1,cmpc);
  int l=0,r=n;
  while(l<=r){
    int mid=(l+r)>>1;
    if(check(mid))l=mid+1;
    else r=mid-1;
  }
  printf("%d\n",l-1);
  return 0;
}

相关文章:

猜你喜欢
  • 2019-02-28
  • 2018-10-24
  • 2018-06-12
  • 2018-10-31
  • 2019-03-07
相关资源
相似解决方案