- 博客(132)
- 收藏
- 关注
原创 AcWing120 防线
知识点:二分这道题怎么说呢,不算难,感觉就是为了二分而二分,但是做这道题把原来理解错的东西发现了,以前一直以为二分的时候,如果有解的范围是1到n,那么最小化的时候,无解应该是n+1,我理解传1和n进去,那么无解就会最后变成n+1,其实不是这样的,如果你想要二分不仅要求解还要判断有没有解,那么你要自己把越界下标或者数据给加进去的,最后算出来是那个数那么就是无解#include <bits/stdc++.h>#define fi first#define se second#define
2022-02-04 23:03:19
553
原创 POJ3104 Drying
知识点:二分这个题,首先洗衣机烘干的那个数据,是带着自然晾干的数据的,也就是如果它是1的话那么烘干机就不起作用,然后我们想到二分,转化为判定,这个是最小化的二分,判定的时候思路要正确,分母是k-1而不是k,最重要的一点,判断函数里面的那个累加的变量可能到longlong,如果想用longlong那么,那么需要在循环的过程中判断,只要它大于二分的值,就返回错#include <cstdio>#include <iostream>#include <cstring>
2022-02-04 20:54:15
206
原创 P2855 [USACO06DEC]River Hopscotch S
知识点:二分,最大化最小值这个题首先肯定要排序,然后需要注意的就是0和终点都有石头,我们判定函数用贪心的时候,要把终点的石头也加入进去,这样当没有中间的石头的时候,也是有可能要去掉石头的,这样这个时候我们去掉了最后的石头,就统一了写法,使这个边界情况正确了#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((i
2022-02-04 18:40:00
552
原创 UVA1610 聚会游戏 Party Games
知识点:不详,这个看不出来是什么知识点,但是我为了分类讨论的时候方便一点,分成三种情况考虑,就是两个字符串的长度关系,可以看出,前面两种是一致的,最后一种最麻烦,要考虑字母的范围,还要考虑最后可能会有的进位,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define
2022-02-04 16:58:46
2102
原创 P2879 [USACO07JAN]Tallest Cow S
知识点:差分这道题不是很难,但是要注意的地方很多,首先,它说某个点最高,我想当然的就把别的点的高度初始化为那个点减一,这个就错了,某点高度最高,那么可能所有点都是这个高度,不影响它是最高的,然后就是它输入两个点的位置,这个可能大位置在前面,这个需要你去判断一下看是不是要交换,然后就是同一对关系可能多次输入,这个就需要你判断这对关系是不是第一次输入的,还有就是题目保证是合法操作,也就是输入不会有两点分别在最高点两边的情况,总之需要注意的地方很多#include <bits/stdc++.h>
2022-02-04 14:43:52
477
原创 P4552 [Poetize6] IncDec Sequence
知识点:差分一道标准的差分题,用这道题来学习一维差分的基本知识与操作,至于思路,李煜东讲的很清楚了,再补充一点,一个序列,如果它是相等的,那么它的差分序列,第一个数就是这个序列的大小,从2到n都是0,这是相等序列的差分序列的特征,后面还遇到了差分套差分,那个就有点难想了,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define s
2022-02-04 14:13:09
394
原创 CF545C Woodcutters
知识点:贪心难度:3看到这个题应该能感受到贪心的玄学了,感觉就是这样做的,,,并不会严格的证明#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using namespace std;typ
2022-02-04 01:59:52
173
原创 POJ2376 Cleaning Shifts
知识点:贪心这个应该是区间贪心里面一个模型的模板题,这个模型就是给一条线段,和若干个闭区间,问能否用这些个闭区间覆盖这条线段,能的话最少用几个闭区间,即使如此,我还是觉得有点难,以前就做不出来,这次也是不停的改才过了,刘汝佳的讲解我属实是看不太明白,他写的话实在想不起来该怎么转化成编程语言,就还是用自己的老方法了,首先输入的时候要处理一下,这个不用多说,直接说主要的思路,我们按照左端点从小到大,左端点相同右端点从大到小的顺序给区间排序,这样的好处是,第一个区间一定是要选的,因为预处理的时候所有的区间左端
2022-02-03 22:01:25
590
原创 UVA714 抄书 Copying Books
知识点:二分首先读题就看出来这个是最小化最大值的二分,从右向左的,然后要注意的是由于是求连续子列的和,所以有可能会出现溢出,需要在相应的地方用longlong,这个题的二分不难写,就是输出很麻烦,它要保证两个条件,一个是前面的子列尽可能小,但是还不能为空,至少要有一个,所以就想到了从后向前遍历,需要分类讨论,这个地方改了很多次终于改对了,#include <bits/stdc++.h>#define fi first#define se second#define pb push_b
2022-02-03 20:14:21
169
原创 P1281 书的复制
知识点:二分,贪心这个题主要是二分,读题可以看到最小化最大值的意思,所以是从右到左的二分,判定条件就是给定一个最大值,能不能让这些书划分成k个最值小于等于它的连续子段,这个判断函数就是用贪心的思想,因为是连续的子段,所有比较好写,太规整了,最后就是输出,这个题的输出也简化了,后面的尽可能的要多干点活,这样前面的就有可能没活干,以前的数据是会出现这种情况的,但是现在的数据保证每个人都有活可干,所以还是放心的输出就行,最后需要注意的是本题输出的是下标,并不是书的页数,#include <bits/st
2022-02-03 14:49:39
256
原创 UVA11292 Dragon of Loowater
知识点:贪心,比较简单的贪心,两个都排序,然后找就行了,对于每个龙,都找大于等于它但是大的最小的骑士,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using namespace std;
2022-02-03 13:31:45
241
原创 POJ2018 Best Cow Fences
知识点:二分,最大连续子列和这个题可以用二分做,是最大化,判定的时候就是将分式乘过来,转化为判定,有不小于某长度的子列和大于等于0,这个判定其实就是求最大子列和,由于数据的问题,需要线性的算法,用前缀和可以实现,这个不论最大值是不是负数都适用的方法,然后这道题的实现上我费了好多时间,一个是用for还是while循环,这个我用for就不对,用while才能过,还是想不明白,然后就是输出的时候是输出l还是r,这个也是会一个过一个不过,总之这个精度问题现在还是头大#include <cstdio>
2022-02-03 01:24:33
125
原创 UVA1152 和为0的4个值 4 Values whose Sum is 0
知识点:二分一道题面非常清爽的题,难度也不是很大,根据数据的规模,知道n的平方可以但是三次方不行,所以可以一半用来枚举,一半用来二分,这样刚刚好,然后就是一个坑的地方,就是我们把两维的数据排序之后用来二分搜索,要注意这里面可能有相等的,到时候假如二分找到了,那么不是加一,而是加上这个数字出现的次数,所以我们一旦找到,还要再进行一次二分,搜索的是原来的数加一,这样就能知道那个数在里面出现多少次了,要加上这个次数#include <bits/stdc++.h>#define fi first
2022-02-03 00:31:20
566
原创 POJ1050 To the Max
知识点:不详题型:最大连续子列和这个李煜东的分类是贪心,但是看不懂,这个方法是陈越的数据结构,第一个例子讲的,是这么一个模型,给一个序列,里面可能有负数,求最大连续子列和是多少,如果最大连续子列和是负数的话取0,话说这里才想到,如果最大连续子列和是负数,那么不是意味这所有的数都是负数,因为但凡只要有一个数是正的或者是0,那么它的最大连续子列和都不会是负数,然后这个方法是陈越讲的线性做法,陈越讲了为什么是对的,但是还是感觉悬,因为自己在考场上不一定能想出来,还是先记住,那个是一维的,这个是二维的,其实还
2022-02-02 21:50:16
238
原创 POJ2976 Dropping tests
知识点:二分这个题有个模型叫什么01分数规划,给你若干个物品,每个物品有质量和价值,让你选k个,问最大的能选到的单位质量的价值是多少,这种题你直觉的那种贪心的做法是错的,至于为什么,举例,书上也没说,然后就是做法,用套二分,白书写的很详细,就不写了,但是那个转化的判断函数属实很巧妙,然后这个题的结果是需要四舍五入的,#include <cstdio>#include <iostream>#include <cstring>#include <cmath&g
2022-02-02 19:14:20
115
原创 P2884 [USACO07MAR]Monthly Expense S
知识点:二分这个是最小化最大值的贪心,是可行解是从大到小也就是从右到左判断的,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using namespace std;typedef long
2022-02-02 16:03:06
330
原创 POJ2456 Aggressive cows
知识点:二分这个是两种最基本的二分之一,最大化最小值,也就是从左向右的二分,#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <vector>#include <set>#include <string>#include <map>#include <stack>#incl
2022-02-02 14:55:05
86
原创 POJ1064 Cable master
知识点:二分这是一个最大化的二分,题目说的是保留小数点后两位,但是这个写法是两位后面的直接舍去了,但是也只能这么写,直接用.f过不了,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using
2022-02-02 14:38:33
246
原创 P2280 [HNOI2003]激光炸弹
知识点:前缀和,这个是李煜东的前缀和例题,是一个二维前缀和,这道题难度降了,原来是绿题,现在变成黄题了,不过最低也就是这个难度了,前缀和有两个基本操作,一个就是原始数据计算出前缀和,一个是由前缀和数组计算出一串连续的数字,或者是一块矩形的,前缀和能优化一个n的时间复杂度,比如说求n个数据的里面连续m个的最大值,不用前缀和的暴力是n的平方,用了前缀和就变成n,另外如果要使用前缀和,储存数据数组下标要从1开始,这样做是为了统一操作,如果求闭区间S到L的数据之和,那么就是L减去S-1,然后就是这道题空间要求
2022-02-02 00:32:01
189
原创 UVA11054 Gergovia的酒交易 Wine trading in Gergovia
知识点:不详看别人分类是贪心题才做的,但是感觉是一个思维题,我的思路就是假如都把就搬到最右边,那么正数过去要给钱,负数过去要收钱,因为本题的数之和能够抵消,反正感觉就是这个样子做的,但是向右扫描的时候要累加,这个也是凭直觉的。。。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size(
2022-02-01 18:44:20
274
原创 UVA11134 传说中的车 Fabled Rooks
知识点:贪心,这道题首先第一步,就是看出结论,行列无关,行按照行的算,列按照列的算,然后发现这个其实就是区间贪心李煜东讲的那个模型,给定若干点和闭区间,一个点只能属于一个区间,怎么放能让更多的区间里面有点,具体到这道题,点就是1到n,点数和区间数相等,题目的意思就是能不能把这个n个点放到这些个区间里面,其实就是求最大被覆盖区间数,如果最大被覆盖区间数等于n,那么说明能,每个点都放到了一个对应的区间里面,那么这个维度上就是有解,判断无解也很简单,这种的思路就是外层遍历区间内层遍历点,如果有一个区间没有放进去
2022-02-01 17:22:13
199
原创 P2878 [USACO07JAN]Protecting the Flowers S
知识点:贪心,邻项交换邻项交换的思路通常用于需要排序的题,还是通过选取里面相邻的两个元素,然后计算分别的结果,可以得到排序的依据,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using na
2022-02-01 15:34:58
151
原创 P1842 [USACO05NOV]奶牛玩杂技
知识点:贪心,邻项交换这种类型的题也是,没见过基本做不出来,只能先记住为什么这么是对的,思路就是中间任意取两个相邻的元素,然后分别计算两个元素在上面的结果,然后就是李煜东的那句话,减少逆序对数不会造成整体结果更差,增加逆序对数不会造成整体结果变好,然后按照排序做就可以了,注意题目里面的那个总压扁指数可能为负数,初始的时候要初始为一个比较小的负数#include <bits/stdc++.h>#define fi first#define se second#define pb pus
2022-02-01 14:56:34
317
原创 P2887 [USACO07NOV]Sunscreen G
知识点:贪心,这是一道稍有难度的贪心,没见过要想想起来比较难,首先我们可以总结一下这个模型,以后遇到这个模型都可以这么做,给定一些闭区间和一些点,问最多能给多少个区间放进去点,注意这里区间和点是一对一的关系,一个点只能照顾一个区间,也就是一个点放到一个区间里面了,就算它在另外的区间的范围,也不能说另外的区间被放进去点,所以这个模型和刘汝佳讲的闭区间选点还是不同的,区别,那个是给定一些闭区间,问最少用多少点能使每个区间内都有点,那个点是可以区间共享的,而且点是无限的,任意选,这个模型的区间和点都是给定的,点
2022-02-01 14:04:23
163
原创 POJ1862 Stripies
知识点:贪心,霍夫曼编码,优先队列,如果想证明的话,可以自己在演草纸上面推一下式子,就知道为什么每次都要取出最大的两个数了#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <vector>#include <set>#include <string>#include <map>#incl
2022-02-01 00:18:18
88
原创 UVA311 Packets
知识点:贪心这是一道没有什么算法知识但是需要动脑子的思维题,以为这一次会写的快一点,结果还是写了半个小时,,,代码能力还是要加强,贪心的思路很简单,就是要从大往小装,我的这种思路难点在于分类讨论,其实也不是太难,就是容易漏,首先装6,这个有多少6就需要多少箱子,然后是5,这个装完之后减去相应的可以补装的1的个数,然后是4,一个4可以给2空出来5个位置,分成两种情况,也就是空出来的位置能不能满足2,然后是3,这个最麻烦,首先分两大类,就是3的个数能不能整除4,不可以的话比较麻烦,不可以的话需要额外一个箱子
2022-01-31 22:02:12
251
原创 P1376 [USACO05MAR]Yogurt factory 机器工厂
知识点:贪心,这道题有点递推的味道,我们在计算的过程中记录当前星期价格的最小值,那么它的值就应该为上一个星期的最小值加上保养费与这个星期直接造里面的最小值,当前的最小值只是有可能影响后面,不会影响前面,因为第几个星期的货物最晚是要那个星期交,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x)
2022-01-31 21:07:15
269
原创 P2859 [USACO06FEB]Stall Reservations S
知识点:贪心,优先队列这道题的贪心思路比较好想,每个牛都不能和别的牛共享,两个数据都是按照从小到大拍,然后按照顺序给它们分配牛棚,但是首先外层肯定要遍历一遍牛,内层如果用朴素的循环那么时间复杂度会超,所以用优先队列来动态维护当前情况下的每个牛棚的占用时间的最小值,也就是队首放的是占用最早结束的,每次遇到新牛,那么都要与队首的相比较,如果符合就修改这个队首元素重新入队,如果队首不满足那么就新入队一个元素,因为最后的输出顺序是按照输入顺序输出的,所以每个牛的数据我们需要用一个结构体来储存,除了区间的两个端点,
2022-01-31 20:21:44
238
原创 UVA1193 Radar Installation
知识点:贪心,这道题可以转化为贪心里面的一个小模型,知道岛的坐标,那么就可以用简单的勾股定理算出来能管它的区间,这个区间里面至少要有一个雷达,而要管住所有的小岛,那么所有的区间都至少要有一个雷达,所以题目就转化为闭区间选点问题,也就是选最少的点使得给定的区间都至少有一个点,这个是紫书刘汝佳讲的三个区间模型之一,转化为这个模型就比较简单了,至于怎么样无解也能很容易想到,#include <bits/stdc++.h>#define fi first#define se second#d
2022-01-31 19:37:49
118
原创 POJ3069 Saruman‘s Army
知识点:贪心,算法竞赛入门,开始学算法,要最开始学贪心,因为我觉得贪心就是蒙策略,模拟的比重很大,要有能把口头语言转化为程序的能力,这不就是模拟,动脑子的地方比较少,主要是前置知识也比较少,贪心就是适用范围广,比较原始的算法,二分还需要前缀和,前缀和学了差分肯定也不能少,并且二分的判断函数会用到很多算法,排序主要就是归并和快速,这两个和分治,递归有很大的关系,而贪心只要你模拟能力比较强,基本都能写对看了08的一集视频回来整理了思路一下子就写出来了,贪心的策略,首先肯定要排序,然后不妨从左到右一个一个找,
2022-01-31 17:20:33
179
原创 P1090 [NOIP2004 提高组] 合并果子
知识点:贪心,霍夫曼编码,优先队列#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vecto
2022-01-31 16:21:08
266
原创 UVA10954 全部相加 Add All
知识点:贪心,霍夫曼编码,优先队列比较简单的霍夫曼编码以及优先队列的简单应用#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using namespace std;typedef long
2022-01-31 16:14:17
160
原创 P6140 [USACO07NOV]Best Cow Line S
知识点:贪心这道题的关键在于当原字符串的开始和结尾字符一样的时候该选哪个,如果只考虑当前情况选哪个都没问题,但是会对下一个字符的选取产生影响,假设下两个字符就不一样了,如果一直一样怎么选都行,如果选了第一个,第二个字符串就露出来了,选最后一个同理,而且后面可能有连续的相同的字符,为了解题方便,我们直接来比较字符串的字典序,而不是去寻找后面第一个字符不相等的两个位置,这样做也行,就是程序会稍微复杂一点,况且问题在于我们两头向中遍历是确定第一次出现字符不等的时候是头这边的小还是尾那么边的小,并不需要求位置,只
2022-01-31 15:18:38
103
原创 UVA1149 装箱 Bin Packing
知识点:贪心,乘船问题比较简单的贪心,题目应该是保证有结果的,从双向开始扫描一遍即可#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()using namespace std;typedef l
2022-01-31 14:06:05
174
原创 算法竞赛入门经典训练指南升级版题解目录
第1章 算法设计基础编号标题难度例题1-1例题1-2例题1-3例题1-4例题1-5UVA10881 Piotr‘s Ants5例题1-6例题1-7例题1-8
2022-01-30 17:36:38
297
原创 UVA11464 Even Parity
知识点:递归,递推和李煜东的那道例题大体思想上一样,指数枚举第一行的时间复杂度是可以接受的,所以枚举第一行,然后由第一行递推得出后面的行,在中间判断存结果就行,需要注意的是,本题只能0变成1,这个不要想当然我一开始做的时候直接默认01可以互换#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x)
2022-01-30 17:26:21
213
原创 AcWing95 费解的开关
知识点:递归,递推,指数枚举首先读题可以发现一些常识性的性质,每个点要么去点,要么就不动,不会点两次,点的先后顺序不影响最后的结果,不妨考虑第一行如何点击,第一行点击就是指数枚举,每个点都有点或者不点两种,点完之后剩下4行的点击情况就可以由上一行递推出来,我们依次向下面一行递归,如果这一行上面的点是关着的,那么这个点就需要点击,最后计算的过程中统计结果即可#include <bits/stdc++.h>#define fi first#define se second#define
2022-01-30 16:20:20
140
原创 AcWing94 递归实现排列型枚举
递归实现排列型枚举,注意,这里是n个不同的数,如果n个数里面有相同的数那么这个方法则不适用,搜索的是下标,每次都是前面多少个位置填好,然后找可以在后面位置填的数#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).e
2022-01-30 14:59:58
51
原创 AcWing93 递归实现组合型枚举
递归实现组合型枚举,就是在前面的指数型枚举的基础上实现的,如果当前已经选择的数超过了m个或者剩下的全部都选也不够m个,那么就剪掉,最基础的剪枝,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define mk make_pair#define sz(x) ((int) (x).size())#define all(x) (x).begin(), (x).end()us
2022-01-30 14:47:14
201
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人