
贪心
文章平均质量分 52
贪心算法题
m0_51303687
取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣。
展开
-
做题记录2021.10.27 洛谷P2672推销员
题目链接我的想法是:假设当前选第i个,那么在前i-1个的基础上有下面两种方法:向前选:距离不变,选价值最大的(假设是第j个),那么res+=a[j].val;向后选:此时距离变大,要选(距离*2+当前已选的元素的价值和)最大的元素。由于要反复查找最大值,我一开始是想用分块或线段树做,但这两种方法似乎很难获取最大元素的下标(第二种方法要获取下标以更新当前距离),所以直接写了个暴力,复杂度为O(n2)O(n^2)O(n2),结果当然是TLE了。然而,我们可以用优先队列优化第一种情况选最大值的过程。原创 2021-10-27 16:50:43 · 149 阅读 · 0 评论 -
做题记录 2021.10.21 POJ2376CleaningShifts
题目链接原创 2021-10-21 18:23:22 · 86 阅读 · 0 评论 -
做题记录 洛谷P1230 智力大冲浪
题目描述小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则:首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi,wi为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整.原创 2021-10-20 14:43:52 · 203 阅读 · 0 评论 -
做题记录 2021.10.17 洛谷P2431
题目链接首先,看到 1,2,4,8…… 这样的序列一定要想到二进制。不难发现,此题就是要我们求[a,b]的所有数中,二进制1最多的那个数的二进制有多少个1。前置知识:__builtin_popcount:GCC中内置的函数,可用于快速计算二进制中1的个数。其对应的64位整数版本为__builtin_popcountll。当然也可以自行实现,但以我的水平只能实现一个O(logn)的。不难发现:如果⌊log2a⌋≠⌊log2b⌋\lfloor log_2a\rfloor\neq \lfloor lo原创 2021-10-17 09:44:25 · 123 阅读 · 0 评论 -
做题记录 洛谷P1843奶牛晒衣服
题目描述一件衣服在自然条件下用一秒的时间可以晒干a点湿度。抠门的熊大妈只买了一台烘衣机 。使用用一秒烘衣机可以让一件衣服额外烘干b点湿度(一秒晒干 a+b湿度),但在同一时间内只能烘一件衣服。现在有n件衣服,第 i件衣服的湿度为wiw_iwi(保证互不相同),要你求出弄干所有衣服的最少时间(湿度为 000 为干 )。输入格式第一行三个整数,分别为 n,a,b。接下来2到n+1 行,第i行输入wiw_iwi。输出格式一行,弄干所有衣服的最少时间。输入样例3 2 1123输出样例 .原创 2021-09-29 10:02:54 · 341 阅读 · 0 评论 -
做题记录 2021.9.10
POJ3276 Face The Right Way这道题可以采取如下思路:不难发现每个特定的区间反转超过1次是无意义的,且反转顺序对结果无影响,所以对于一个反转次数k,可以贪心地假定从第一个开始,如果当前为反面就反转连续k个,否则不反转。如果遇到需要反转但只能反转一部分的情况(即i+k>n),那就说明方案不成立。最坏情况下,每个k要反转n-k+1次,每次反转k头牛,一共就要∑k=1nk(n−k+1)\sum_{k=1}^{n}k(n-k+1)∑k=1nk(n−k+1)次,时间复杂度达到O(n3原创 2021-09-10 10:49:27 · 79 阅读 · 0 评论 -
做题记录2021.9.2 洛谷P4447分组
一开始的思路是二分答案,但后来发现不需要。考虑将数组排序,从第一个开始,到不连续或有重复的地方停止算作一组,如此重复直到最后一个。但此方法只能得60分。正确思路是:维护一个序列group[],表示每组“能力值”最大的人的“能力值”。每到一个人都判断他是否比某组group值恰好大1。为了能让最小人数的组的人数最多,要同时设置另一个数组len[],当有多个组符合时就取人数最少的那组。实现如下:#include <cstdio>#include <algorithm>const.原创 2021-09-02 13:29:16 · 191 阅读 · 0 评论 -
做题记录2021.9.1 洛谷P3851路标
最小化最大值,很明显是二分答案。关键在于check函数怎么写。思路是:从起点开始,找到第一个与后面的点距离>给定距离x的点,并在它后面k处加一个点。如此循环直到要加的点数>k(返回false)或当前已经到最后一个点为止。因为要加点,所以我的想法是维护一个链表,可以在O(1)的时间内完成插入操作。实现如下:#include <cstdio>#include <algorithm>#include <vector>const int M=100001.原创 2021-09-01 14:56:49 · 101 阅读 · 0 评论 -
做题记录 2021.8.31 dotcpp1549积木游戏
题目描述最近的m天盾神都去幼儿园陪小朋友们玩去了~每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西。但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他 小朋友的积木才能完成他的大作。如果某个小朋友完成了他的作品,那么他就会把自己的作品推倒,而无私地把他的所有积木都奉献出来;但是,如果他还没有完成 自己的作品,他是不会把积木让出去的哟~盾神看到这么和谐的小朋友们感到非常开心,于是想帮助他们所有人都完成他们各自的作品。盾神现在在想,这个理想有没有可能实现呢?于.原创 2021-08-31 15:44:16 · 124 阅读 · 0 评论 -
学习记录2021.7.19
由于本人太菜,平时在洛谷做题,基本都是橙~黄,今天去挑战了一个绿题,结果还是遭到暴击,没办法毕竟太弱了。以下为记录:题目链接原题要用高精度,因为懒 这里就不用了。此题很容易想到O(n*n!)的做法,即枚举所有全排列并按照题意模拟,代码如下:#include <cstdio>#include <algorithm>#include <climits>#define INF LLONG_MAX#define ulong unsigned long longc原创 2021-07-19 17:55:06 · 79 阅读 · 0 评论 -
做题记录2021.7.11
乍一看,好像是每次都删除最大的数,可果真如此吗?这错误是很显然的,就比如题目给的样例,如果把k改成1,则按此方案输出17543,但答案显然是15438。本题正确思路为:从左到右扫描字符串,找到第一个i使s[i+1]<s[i],删除s[i]即可。我一开始是采用改为非数字字符的方法删除字符的,但这样就不一定是与s[i+1]比较了,需要找到第一个a,使s[i+a]为数字且s[i+a]<s[i],如果这样的话又会出现数字递增就无法删除。提交记录2:要判断的情况就比较多,所以干脆使用subs.原创 2021-07-11 15:27:49 · 83 阅读 · 0 评论 -
做题记录2021.7.10
典型贪心思路,个人感觉和哈夫曼编码的思想相似,每次都选最小的两个合并。思路1:暴力解法每次都先将数组排序,为了方便起见,设置两个变量l,r,每次操作结束后l+=2,r+=1,并将前两个数的和加入数组末端。实际就是模拟一个队列。复杂度O(n2logn)。思路2:优化解法为避免每次排序,可以设置一个很大的数INF,每次操作把第二小的数设为INF并与a[n-1]交换,也就是和冒泡排序一样“沉底”。下一次查找时只需在前n-1个数中查找即可。复杂度O(n2)。#include <cstdio>.原创 2021-07-10 16:27:26 · 94 阅读 · 0 评论 -
做题记录2021.6.27
思路1.暴力枚举#include <cstdio>#include <algorithm>const int M=100001;using namespace std;double r[M];int main(){ int n,m,maxi=0; double sum=0; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%lf",&r[i.原创 2021-06-27 15:10:46 · 78 阅读 · 0 评论 -
做题记录2021.6.26
题目描述给定x轴上的N(0<N<1000)条线段,每个线段由它的二个端点aia_iai和bib_ibi确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分)。输入输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表示一条线段的二个端点的坐标。输出输出原创 2021-06-26 08:55:03 · 213 阅读 · 0 评论