博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1577: [Usaco2009 Feb]庙会捷运Fair Shuttle
阅读量:5794 次
发布时间:2019-06-18

本文共 1239 字,大约阅读时间需要 4 分钟。

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

【算法】贪心+堆

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

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

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

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

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

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

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

复杂度O(k log k)。

#include
#include
#include
using namespace std;const int maxn=200010;struct cycmax{ int id,ed; bool operator < (const cycmax &a)const{ return ed
cmax;struct cycmin{ int id,ed; bool operator < (const cycmin &a)const{ return ed>a.ed; }};priority_queue
cmin;struct cyc{ int l,r,num;}a[maxn];bool cmp(cyc a,cyc b){
return a.l
c){ cycmax x=cmax.top(); if(!vis[x.id]){ if(number-a[x.id].num>=c){ number-=a[x.id].num; vis[x.id]=1; 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 0;}
View Code

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

转载于:https://www.cnblogs.com/onioncyc/p/7689303.html

你可能感兴趣的文章
Codeforces Gym 100610 Problem E. Explicit Formula 水题
查看>>
最新 Windows 10 应用项目模板发布
查看>>
HTMLParser 使用详解
查看>>
SettingsNotePad++
查看>>
Kotlin入门简介
查看>>
leetcode:Symmetric Tree
查看>>
Android实现微博分享及其注意事项
查看>>
创建快照
查看>>
find命令应用exec及xargs
查看>>
安装Node.js
查看>>
基于二叉树和双向链表实现限制长度的最优Huffman编码
查看>>
LoadRunner使用入门 进行Webservice负载測试
查看>>
SVN中检出(check out) 和 导出(export) 的区别
查看>>
localtime死锁——多线程下fork子进程
查看>>
(转)Arcgis for Js之GeometryService实现测量距离和面积
查看>>
flex 通过htmlservices链接moss的rest(rest 的get post方式)
查看>>
maven入门(6)maven的生命周期
查看>>
python接口自动化9-https请求(SSL)
查看>>
掌握Chrome Developer Tools:下一阶段前端开发技术
查看>>
HttpModule的认识
查看>>