Luogu P2107 小Z的AK计划 堆贪心】的更多相关文章

好久不做这种题了... 存一下每个点的位置和时间,由于达到某个位置跟之前去哪里AK的无关,所以在时间超限后,可以用大根堆弹掉之前消耗时间最大的,来更新答案,相当于去掉之前花费最大的,直到时间不在超限. #include<cstdio> #include<iostream> #include<queue> #include<algorithm> #define ll long long #define R register ll using namespace…
最近复习了一下堆,于是去luogu上找一些简单题写一写 贪心的想,小z不会到一半以后回头去Ak,因为这样从时间上想肯定是不优的,他可以早在之间经过时就AK所以我们可以将所有机房按照横坐标排序可以想到的是,我们最后肯定是要走过所有的机房,也就是说路程消耗的疲劳值是不可避免的.我们只能尽可能的减少小ZAK所花费的时间贪心的考虑,当我们在机房Ak所花费的时间长时,我们可能能在这个时间内AK更多的机房所以当时间出问题时,我们肯定要取出堆顶删除以便AK更多的机房.我们维护一个关于机房AK时间的大根堆,每次…
题目类型:贪心,堆 传送门:>Here< 题意:给出\(N\)个房间,每个房间距离起点的距离为\(x[i]\),每个房间可以选择进去和不进去,如果进去了那么要\(t[i]\)秒后才能出来.问在\(M\)秒内最多能进多少个房间 解题思路 第一眼是一个\(01\)背包,然而枚举当前房间和上一个房间,加上所用时间,复杂度\(O(n^3)\)-- 考虑枚举终点,这样所有路上的时间之和就可以确定了.然后就是看在剩余的时间里最多能去几个房间,这个很简单--假设全去,如果超时,那么每次踢出耗时最多的那个房间…
水一发优先队列的水题.. 这个题貌似以前有做过类似的.具体的方法是用大根堆辅助贪心算法得出正解.可以看出来,如果小Z走到了某个地方,那么他最远一定是到了这里,不可能有再走回来这种操作,因为很明显那样不是最优解. 然后我们基于刚才的考虑贪心,如果走的远近确定了,那么我们的选择一定是最小的那些店,维护一个大根堆,然后从小到大枚举位置,每枚举一次就入队一个数,如果当前的总和比疲劳值大了,就弹出队首元素.记得开longlong. #include<iostream> #include<cstdi…
#include<iostream> #include<queue> #include<algorithm> using namespace std; struct data { long long wei,time,tot; }a[100001]; long long n,m,sum,ans,head; bool cmp(data a,data b) { return a.tot<b.tot; } int main() { cin>>n>>…
Description Luogu2107 Solution 一开始打了一个60分的暴力DP,结果一分都没得--本地调了好久才发现是没开long long. 由于我的DP方程没有任何性质,就是一个01背包,所以就没啥可优化的了. 这个题的正解其实不是DP,而是贪心--由于是单向的走,在每个位置选用时少的机房AK总是好的,这也就等价于不在用时多的机房AK,所以开个堆存一下AK了那些机房,超时了就把时间最长的机房去掉就行了. Code DP: #include <algorithm> #inclu…
题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜…
清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不選前面那個選當前這個,應該是比較好的思想 這道題還有一個就是如果最優解要你走到那個點,那麼中間的路程是不可省略的,所以貪心時大可不考慮 反正實質上是個dp,取的是最大值 #include<bits/stdc++.h> #define ll long long using namespace std…
题目描述 虽然在小X的家乡,有机房一条街,街上有很多机房.每个机房里都有一万个人在切题.小X刚刷完CodeChef,准备出来逛逛.机房一条街有n个机房,第i个机房的坐标为xi,小X的家坐标为0.小X在街上移动的速度为1,即从x1到x2所耗费的时间为|x1−x2|. 每个机房的学生数量不同,ACM题目水平也良莠不齐.小X到达第i个机房后,可以花 ti的时间想题,然后瞬间AK:当然,也可以过机房而不入. 小X现在只有m个单位时间,之后他就该赶着去打Codeforces了.现在他想知道自己最多能在多少…
看范围猜方程,应该是O(n)级别的 f[i]表示前i个合法的最小代价,转移需要枚举断点位置,O(n^2) f[i]表示前i个合法留下的最大个数,同时更新距离最近的26个字母的位置,O(n)转移 f[i]=max{f[pos[j]+1} 0<=j<=25,j和a[i]可以同时出现 #include<iostream> #include<cstdio> using namespace std; ; ]; ][]; int n,m; ]; int main(){ scanf(…