【题意】公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地。

【算法】贪心+堆

【题解】线段和点的贪心,一般有按左端点排序和按右端点排序两种方法。

按左端点排序,到达了终点就下车,人数满了就贪心地删掉当前终点最远的牛。

正确性在于,在对左一致的情况下,优先删除对右影响最大的牛。

本来以为很难实现,但是想清楚之后写起来十分顺畅,还是要有信心><

对于到达终点下车,按终点维护小根堆。

对于满人数贪心删终点最大的,维护大根堆。

用标号vis和剩余牛数num连接两个堆的删除。

复杂度O(k log k)。

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=;
struct cycmax{
int id,ed;
bool operator < (const cycmax &a)const{
return ed<a.ed;
}
};
priority_queue<cycmax>cmax;
struct cycmin{
int id,ed;
bool operator < (const cycmin &a)const{
return ed>a.ed;
}
};
priority_queue<cycmin>cmin;
struct cyc{
int l,r,num;
}a[maxn];
bool cmp(cyc a,cyc b){return a.l<b.l;}
int k,n,c,ans=,number=;
bool vis[maxn];
int main(){
scanf("%d%d%d",&n,&k,&c);
for(int i=;i<=n;i++){
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].num);
}
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++){
cmax.push((cycmax){i,a[i].r});
cmin.push((cycmin){i,a[i].r});
number+=a[i].num;
if(a[i].l!=a[i+].l){
while(!cmin.empty()&&cmin.top().ed<=a[i].l){
cycmin x=cmin.top();
if(!vis[x.id]){
ans+=a[x.id].num;
number-=a[x.id].num;
vis[x.id]=;
}
cmin.pop();
}
while(number>c){
cycmax x=cmax.top();
if(!vis[x.id]){
if(number-a[x.id].num>=c){
number-=a[x.id].num;
vis[x.id]=;
cmax.pop();
}
else{
a[x.id].num-=number-c;//zhu yi shun xu le!!!
number=c;
}
}else cmax.pop();
}
}
}
while(!cmax.empty()){
cycmax x=cmax.top();cmax.pop();
if(!vis[x.id])ans+=a[x.id].num;
}
printf("%d",ans);
return ;
}

另一种做法,按右端点排序,能塞就塞,不能塞就不要,用线段树维护。(感性的理解一下,替换之前的效果一样却反而会占用到后面的,既然前面能解决的事为什么要交给后面的)

最新文章

  1. 任务调度框架-Quartz.Net
  2. dede的安装和配置
  3. Unity-WIKI 之 AllocationStats(内存分配)
  4. Windbg CLR基础小测 《第六篇》
  5. Nunit单元测试的使用
  6. linux 错误总结
  7. druid配置(转)
  8. All About JAVA Maven的安装
  9. linux命令:Linux命令大全
  10. 小结php中几种网页跳转
  11. Java学习之二维数组定义与内存分配详解
  12. 测试面试话题8:测试人员如何让开发少写bug?
  13. OC内存管理、非ARC机制、MRR机制
  14. leetcode-28.实现strStr()
  15. 【tmos】spring data jpa 创建方法名进行简单查询
  16. NodeJs学习相关网址
  17. Oracle 自定义实用函数
  18. MyEclipse配置,每次打开server中都没有weblogic
  19. asmlinkage的作用
  20. bootstrap dialog对话框,完成操作提示框

热门文章

  1. 使用cout进行格式化
  2. 有关c#的学习笔记整理与心得
  3. java实现几种简单的排序算法
  4. ALPHA-3
  5. 创建、编译、执行 java程序
  6. 第一、二章——Python简介与Python基础
  7. MySQL event调度
  8. mysql向上递归&amp;向下递归
  9. 【EF】Entity Framework Core 2.0 特性介绍和使用指南
  10. 【bzoj1692】[Usaco2007 Dec]队列变换 贪心+后缀数组