好久不做这种题了... 存一下每个点的位置和时间,由于达到某个位置跟之前去哪里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…
题目描述 虽然在小X的家乡,有机房一条街,街上有很多机房.每个机房里都有一万个人在切题.小X刚刷完CodeChef,准备出来逛逛.机房一条街有n个机房,第i个机房的坐标为xi,小X的家坐标为0.小X在街上移动的速度为1,即从x1到x2所耗费的时间为|x1−x2|. 每个机房的学生数量不同,ACM题目水平也良莠不齐.小X到达第i个机房后,可以花 ti的时间想题,然后瞬间AK:当然,也可以过机房而不入. 小X现在只有m个单位时间,之后他就该赶着去打Codeforces了.现在他想知道自己最多能在多少…
清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不選前面那個選當前這個,應該是比較好的思想 這道題還有一個就是如果最優解要你走到那個點,那麼中間的路程是不可省略的,所以貪心時大可不考慮 反正實質上是個dp,取的是最大值 #include<bits/stdc++.h> #define ll long long using namespace std…
传送门 Description 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1, 当然询问一个矩阵的G值实在是太简单了.小Z在给出一个N*N矩阵的同时将给你Q个操作,操作描述如下: 操作1:形如一个整数1和一个整数x,表示将第x行的元素全部“翻转”. 操作2:形如一个整数2和一个整数x,表示将第x列的元素全部“翻转”. 操作3:形如一个整数3,表示询问当前矩阵的特征值G. “翻转”的定义为将1变成0,将0变成1. Input 第1行:两个…
原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件的点对的数量. 假设点对是(i , j),max(l,r)是[l,r]当中最大的ai的值. 这个点对满足条件当且仅当i+1<j 且 ai < max(i+1,j-1) < aj 为了简单,保证输入的是一个1-n的排列.相信你已经会做了吧? 输入/输出格式 输入数据第一行有一个数字n,然后第二…