自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 POJ - 3579 二分枚举答案 查找第K大

题目题解思路很显然不能直接求出ans数组,先将数组排序,因为是任意差值的绝对值,顺序并不影响,我们对答案进行枚举。ans数组大小为n*(n-1)/2 ,这是可以根据等差数列求和得到的。答案需要介于符合大于一半的ans数组数到不符合的左右。设枚举的答案为p当我们排序完后,很容易枚举出p小于等于那些差值的数量和sum,利用二分函数就可以得到,不论奇数偶数都应该大于ans数组的一半,因为sum包含了p自己的值。这里还有个有点玄学的问题。关于二分出来的边界问题,如果验证出来要从下界更新且都为正整数,

2021-07-30 16:40:38 156

原创 POJ - 2976 二分枚举答案 最大化平均值

题目题解思路白书里的例题,直接对浓度进行枚举。对每个浓度贪心的判断是否可行。将方程转变,浓度带入后排序贪心。对于二分枚举答案,答案需要精度时,我们一般直接让答案二分跑100次,而且边界尽量开大点。坑点四舍五入AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;long long a[1010],b[1010]; double c[

2021-07-30 15:13:34 134

原创 POJ - 1064 二分枚举答案 floor向下取整函数

题目题解思路我们可以得到答案的区间 0 到薯条平均长度 。直接取上界为INF,下界为0进行二分枚举答案。我们让二分进行100次,可以让答案精确到10的负30次方,所以上界不需要那么精确都行。输出有点坑,不能四舍五入。用floor函数先乘100将那两位数提出然后抹去小数位,然后除回去。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>us

2021-07-29 14:30:03 124

原创 POJ - 3421 质因数的排列组合

题目题解思路参考大佬的博客相当于对所有质因子进行排列组合,从1开始往右边乘,这样一定满足从右往左边能整除。AC代码#include <iostream>#include <algorithm>#include <cstdio>#include <vector>using namespace std;int vis[1050500];vector <int> ss;int main (){ ios::syn

2021-07-28 20:45:26 241

原创 UVA - 10006 快速幂 + 埃式素数筛法

题目选择一个数a 来满足条件题解思路先筛出范围内的所有素数,判断完不是素数后再用快速幂来遍历判断。坑点快速幂都要用longlong,别以为有取模就不会爆int,乘的时候照样可能爆了!。AC代码#include <iostream>#include <algorithm>#include <cstdio>using namespace std;int vis[80000];long long kuaisumi(long long di,lo

2021-07-28 15:33:00 72

原创 Aizu - 2224 最小生成树变式

题目有n个点和m条边,每条边有不同的权值,问最少花费多少删除边能使得图中没有圈。给你点的坐标,自己计算边权。结果保留3位小数。题解思路有位大佬讲的很好大佬的博客没看懂题目郁闷好久AC代码#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int maxn = 0x3f3f3f3f ;s

2021-07-28 14:29:18 113

原创 Aizu - 2249 在 最短路 基础上 求此时的最小生成树

题目链接题解思路1e5 不存在 负权 锁定 堆优化迪杰斯特拉来处理最短路生成树就是每个源点被松弛后加入dis数组所组成的,我们只要在松弛后将每个点提供生成树的值代入即可。不过还是有特殊条件的,当边等于此时的dis值时,我们要选择较小的花费,此时可以松弛也可以不松弛,对最短距离并没有影响。最后再累加上每个点提供的生成树值即可。AC代码#include <iostream>#include <cstdio>#include <algorithm>#in

2021-07-27 21:14:50 93

原创 POJ - 3723 最小生成树 最大生成树 求最大优惠值

题目题解思路没看清题目,被绕了一下,这里每个人的雇佣费用都是固定的,我们进行要求出能优惠的最大值,根据题目的权值,可以生成一个最大生成树,求出优惠的最大值。一开始写着写着写成贪心了,忽略了一个人有多个关系的情况,这里用树形的结构就能很好处理了。AC代码#include <iostream>#include <algorithm>#include <cstdio>using namespace std;struct node{ int x,

2021-07-27 17:10:16 54

原创 CodeForces - 1095D 思维 逻辑模拟 想复杂了

题目题解思路AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>using namespace std;const int INF = 0x3f3f3f3f;struct node{

2021-07-27 15:00:56 74

原创 CodeForces - 1095E 括号匹配 栈的运用

题目题解思路各种前缀后缀中缀表达式都可以由栈来解决。每个括号需要找到他对应的括号。我们将左括号压栈,当遇到右括号时出栈。将括号的编号压栈!此时我们遵循括号就近匹配,利用先进后出来推出的。(这个特性有助于推出答案)当遇到无法处理(栈中没有元素来匹配)的括号时前压栈,由于我们只能进行一次操作,所以最后栈中只能存在2个无法匹配的元素。由于每种情况不同,我们进行分类特判处理。))左括号无法匹配,此时我们现在左括号前的任意与左括号相同的元素来替换,因为左括号右边的元素已经被匹配。(参考前面的特性)

2021-07-27 14:06:41 168

原创 CodeForces - 1095C 位运算的处理 存幂次 标记数目 有点陌生

题目题解思路将数字转换成二进制处理,也叫位运算。从最高位开始往下压缩,每次压缩都能提供1的贡献,因为本来是一个数,现在变成两个数,这样下一位的标记数需要加2,当压缩到1时还是弄不出这个K值就不能表示。此外最小的K值就是用数表示二进制中的所有1的个数,最大就是数本身(全转化为1)。 (可以进行提前特判)AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue&

2021-07-27 11:16:29 224

原创 CodeForces - 1095F 最小生成树 贪心优化建边

题目题解思路裸的最小生成树,比赛时就差一点就写出来了。如果建边不优化那么就有N平方的复杂度了,显然不行。想到了利用点权先贪心出一个最小的,但是想偏了,排序连成一条线了,固有思维,总是以为必须不停的换点。结果只需找到最小的点和其他点建边即可。AC代码#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;c

2021-07-27 10:28:24 163

原创 POJ - 1703 种类并查集 带权并查集

题目题解思路因为是提示不同帮派,所以不能用普通的并查集来解决。注意的 点就是 不同帮派的人的不同帮派就是同一个帮派的。很容易想到带权并查集来解决,两个状态0 1 代表相同和不同帮派。这里还有种用朴素并查集实现的种类并查集可以解决这种问题。开两倍的空间,利用n外的数来附加n内的数的状态。记 a b c b 相连我们不直接让 a b 相连 ,让 a和 b+n b和 a+n相连。 c b+n c+n b相连这时就会有路径压缩使得a和c相连了,这样说明a c有间接的关系。AC代码普通并查

2021-07-26 17:13:33 229 2

原创 POJ - 3614 贪心+优先队列优化 贪心策略 物尽其用

题目题解思路对于每只鹅,我们尽可能的选择接近的防晒霜。也就是,让鹅的min和防晒霜升序排列,然后研究每个防晒霜对于鹅,符合最小值的,将其的max值加入队列,从小到大出队。让防晒霜物尽其用。AC代码#include <iostream>#include <cstdio>#include <queue>#include <algorithm>using namespace std;struct node{ int ma,mi;

2021-07-26 14:53:45 91

原创 POJ - 2431贪心 + 优先队列

题目题解思路贪心思维走到不能走时,不断用之前走过的能加油的最大值加,加到加不了还是走不到就是-1。这样只能判断所有加油站能不能到,这时我们在重点设置一个虚拟加油站来进行上面的操作。寻找最大量加油的过程用优先队列优化。边走边把能加油的加上。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <queue>using namespace std;st

2021-07-25 18:35:54 157

原创 Codeforces Round #706 (Div. 2) AB

A给出一个字符串以及长度N和K,判断字符串能否包含K个回文字符。题解思路按题目模拟,寻找有没有足够的回文字符。AC代码#include <iostream>#include <string>using namespace std;char s[200];int main (){ int t; cin>>t; while(t--) { int n,k; cin>>n>&g

2021-07-19 15:32:01 76

原创 Codeforces Round #705 (Div. 2) AB

A在1到N中选择最大的个数组成一个集合,使集合的任意子集不等于K。题解思路从 (k+1)/2到K以及k+1到N中取到。K数可能由多个数取到,多个数最终变成由两个数组成。一大一小,我们必须只能拿一个,拿大的,因为小的可能被更小的组成了,这样就变回了多数组成。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <str

2021-07-19 14:15:46 56

原创 Codeforces Round #704 (Div. 2) AB

A3个人在游泳池不断的 按一定的时间每圈 游 a , b , c给一个时间点P,求最近多少时间有游泳者经过。题解思路模运算P对每个圈速取模,求出快到达P时间的最后一圈走了多少,用圈速减去这个时间,再对圈速取模,因为有可能最后一圈刚好到了取最小值即可。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <str

2021-07-18 15:32:54 48

原创 Codeforces Round #703 (Div. 2) AB

A有N个堆栈,每个栈都有非负数。可以进行操作将正数的第i个堆栈减一,传递给下一个堆栈i+1。操作可以进行任意次。判断能否让堆栈严格递增。题解思路贪心,考虑最极端的情况,堆栈的最小的情况数从0开始到n-1。如果前面有多的话,可以将数字全部转移到最后一个堆栈,也符合严格递增。如果前面有少的话,那就不行了,因为无法给前面补充元素。用两个前缀和判断就行了。添加堆栈的时候,判断有没有少元素。AC代码#include <iostream>#include <cstdio&g

2021-07-14 23:59:29 62 1

原创 Codeforces Round #701 (Div. 2) AB

A给出数A和B。每次可以进行 这两步操作求让A变成0,最小的操作步数。题解思路枚举 + 剪枝 。这题让我见识到了剪枝的强大之处。一开始也想到了类似的方法,看到题目数据量大,就不敢写了。其实幂次运算的数据量并不大的我们很容易知道一个答案就是A-B+2,将B加到比A大然后做除法,这是B最大的情况。每次将B不断向前加,再更新最小值,这样可以对枚举的区域进行剪枝。幂次运算剪枝下来也就十多,K一下子变的好小了。AC代码#include <iostream>#include

2021-07-14 19:38:06 86

原创 Codeforces Round #700 (Div. 2) AB

AA和B同时操作一个字符串S(将某个位置的字符改变,并且不能相同),A想让字符串字典序变小,B则相反,A先操作。两个人都同时选择最优的情况。每个位置只能被操作一次。求操作后的字符串。题解思路贪心。从前往后A加a,加不了就加b,B加z,加不了就加y。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <string>using namespace std;

2021-07-14 14:08:37 109

原创 Codeforces Round #699 (Div. 2) AB

A给一个目标坐标,给出上下左右的运动路径,求在可以删除一部分路径的时候判断能否到达目标点。题解思路暴力出奇迹。因为到达的点必须的步数使和路径没有关系的,所以我们记录上下左右的多少,然后比较到这点必须走的上下左右,有没有够就行了。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <string>using namespace std;int main (

2021-07-14 11:45:04 63

原创 ACwing 3763. 数字矩阵 脑筋急转弯 思维

题目题解思路找规律可以知道任意两个点是可以传递正负关系的,所以我们只要知道负数的奇偶,偶数时直接全正,奇数时需要寻找一个绝对值最小的数来抵消一个负号。AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int main (){ int t; cin>>t; while(t--) {

2021-07-13 17:10:17 112

原创 训练赛Round #8 被B题卡太久了

A给一串序列可以任意的添加数字让每个相邻两个数 满足 小的数的两倍 大于等于大的数求满足条件且添加次数最小的情况题解思路一开始还感觉很难 , 认真看了看,直觉 ,直接贪心,不断把 不满足条件中的两个数中的 小的数的两倍加到之间 加到 加不了 (符合两倍小于等于大的数的)就行了。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#inclu

2021-07-13 16:19:21 76

原创 Codeforces Round #698 (Div. 2) AB

A给一排升序排序的数字,给数字涂色,要求去掉某个颜色之外的所有数,该颜色的数,呈严格递增,就是不重复的升序。只有一个数的时候也符合题意。要求使用最少的颜色数。题解思路就是记录出现次数最多的数。AC代码#include <iostream>#include <cstdio>#include <cstring>using namespace std;int vis[200];int main (){ int t; cin>&

2021-07-12 17:10:53 51

原创 Codeforces Round #696 (Div. 2) AB

A字符串只包含0 1 ,给一个字符串B,让其与字符串A与 与运算(有1则1),题目有个特殊规定 两个1 得出2 ,得出的字符串C,要不能存在连续相同的数,否则就移去连续相同的数,使其不连续相同,得出D。求D的最大值。题解思路首先位数必须不能被改变,每一步不能有连续相同的数。让数最大贪心即可,记录上一位的数字,有1试试能不能上2不能就上1,有0试试1不能就上0。AC代码#include <iostream>#include <cstdio>#include <ve

2021-07-12 16:05:51 45

原创 Codeforces Round #695 (Div. 2) AB

A构造最大序列,序列满足 所有数对10取模。原本序列数都相等。引入了对某点进行时间暂停操作,之后会让附近的数都加上距离数。A题解思路我想的是构造98765432101234567890123…但答案是98901234567890123456…即在所有数为8时可能在第二个位置按下暂停。思维太弱。AC代码#include <iostream>#include <cstdio>using namespace std;int main (){ int t

2021-07-10 17:49:03 45

原创 Codeforces Round #694 (Div. 2) AB

A引子为可以将数组中相邻的两个数合并,让数组总数减少。题中要求寻找最大最小完美值,即数组中每个数除以X的向上取整值之和。A题解思路最大完美值就是不合并,因为当合并之和,有些数会成X的倍数,这样就不能向上取整让值变大了。最小完美值就是将所有数合并所求出的。被困在题目中要求的只能合并相邻的数,WA了一次,可以组成倍数的数可能不相邻,但是合并并不会影响值变大的数,除的时候可以提取出来除。AC代码#include <iostream>#include <cstdio>

2021-07-10 16:09:00 44

原创 AcWing 3734. 求和 DFS枚举 区间优化处理

题目链接题解思路策略就是枚举到符合1e9的数,这样需要搜到10位,枚举完排序,对应区间进行优化,暴力会TLE,枚举数到目标数可以直接做乘法乘数量来减少枚举的数量。数据类型记得longlong int 直接爆。AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;long long a[1300000];int p;void dfs(

2021-07-08 18:29:03 84

原创 CodeForces - 1433D 思维 建树

题目题解思路将1号与第一个帮派不同的全部连起来,再将与1号相同的连接再任意1号已经连接的区域。这样出来的还是N-1条边,总以为不是,不敢往这方向想。这样建成了一棵树就满足题目要求了。思维思维。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>

2021-07-06 17:33:23 126

原创 CodeForces - 1433E 圆桌排序 组合数学

题目题解思路高中的圆桌排序,早就忘光了。N个人选择一半进行组合,C(n,n/2) 因为可以交换结果还要除以2,然后再乘上两边的圆桌排序数即可。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>using namespace std;co

2021-07-06 17:01:54 267

原创 POJ - 1017 装箱问题(贪心)

题目题解思路一开始想用优先队列,结果不知道怎么用上去。翻了翻大神的题解。根据3456的个数来判断满足3456至少需要多少箱子,再根据3456空缺的位置,优先填2,因为1最终可以又2分解出来,而1不能分解出2。最后判断2 1 的个数是否符合条件,不符合就加箱子。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <queue>using namespa

2021-07-05 18:04:47 134

原创 POJ - 3190 区间重叠变式 贪心 优先队列

题目N (1 <= N <= 50,000)题解思路将区间按左端点升序排列,然后将一层一层数轴用优先队列来处理,优先队列存储最大右端点和层数的标号(因为我们最后要得到每个区间对应的数轴编号)因为左端点是升序的,我们让优先队列按右端点的从小到大出队。这样我们能保证,此时的队头数轴是能放的最优数轴。如果还是放不下(重叠了),就新增一个数轴并且编号即可。AC代码#include <iostream>#include <cstdio>#include <q

2021-07-05 11:01:44 122

原创 POJ - 1328 区间贪心 区间覆盖 挺多细节的

题目题解思路首先我们将问题抽象化,利用勾股定理用区间来表示这个岛在岸上大炮能放的位置,我们要做的就是将区间重复的位置找出来,这样我们就可以节省大炮了。将区间按右端点从大到小排序,按从右到左来遍历处理。当发现左端点够不到新点的右端点时,我们要新增一门大炮,并将左端点更新为这个新点的左端点。当发现够得到时,我们就可以节省大炮了,但是我们这门大炮的范围会受到他的影响,有可能这个点的左端点太大了比这个大炮左端点还大时,我们要更新大炮的左端点当发现某点的高度大于大炮的半径时或者大炮半径为负时,我们要进行

2021-07-04 16:17:04 107

原创 Codeforces Round #729 (Div. 2) B题 思维 化简

题目无限集内的元素X可以进行操作X*A X+B。产生的元素仍然在集合中。判断N是否在集合中。题解思路对这个元素的究极化简就是要找出他的一般式,就是这个东西把我绕的团团转。经过找规律等等操作最简式为就是这样那么这题就简单多了,直接找到最大的这个次幂,存起往下的所有次幂数,我们必须全部枚举,因为k可能非常大,所以所有次幂都有可能组成这个元素。昨天写的时候写的很复杂,导致我没化简出来。AC代码#include <iostream>#include <cstdio>

2021-07-04 11:28:35 66

原创 POJ - 2376 区间贪心 区间覆盖

题目题解思路左端点从小到大,对右端点从大到小,这样保证了初始节点的最优,再根据两个极限情况特判 初始节点的左端点大于1,或者右端点等于t。这样我们只要在初始节点的基础上上,贪心的 找到左节点符合要求右节点又能最远的情况。这个贪心策略很容易想到,但是代码实现还是有点难,用了大量标记来解决。AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;s

2021-07-03 17:44:03 145

原创 POJ - 3069 区间贪心问题

题目题解思路参考大佬的文章讲解区间贪心区间贪心分为三种,此题属于区间覆盖。我们先将点从小到大排序,如何用一个R的距离来看看能覆盖最远的点,将该点选为标记,然后继续往前覆盖R的距离以内的点。AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int a[1010];int main (){ int r,n; while(~

2021-07-03 16:03:48 184

原创 POJ - 3617 贪心 双指针 字符串处理

题目题解思路运用双指针,对两边的字符大小做比较,拿小的,当发现他们相等时不能乱拿,要扫一遍看看之后有没有更小的在一边,如何有就拿那一边的。这样就能保证字典序最小。输出要注意了,80个字符要换行。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <string>using namespace std;string s,t;int check(

2021-07-03 09:31:13 111

原创 Aizu - 0525 行列01翻转 二进制枚举

题目给出n行m列的0、1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0。问通过任意多次这样的变换,最多可以使矩阵中有多少个1。N >= 10 M <= 10000题解思路行比较少,我们可以枚举行的变换来确定列。当列的1数目大于一半时不翻转,小于等于时翻转,等于翻转就涉及到奇数取整的问题,例如 1 3 3/2 = 1 .但如果翻转了就是2了,所以等于也要翻转。这里我用二进制枚举,建议用二进制枚举时数组从0开始,方便后面枚举。AC代码#include &

2021-07-02 17:40:06 383

原创 POJ - 3187 回溯DFS 或者 全排列next_permutation() 暴力枚举

题目链接题解思路因为数据量小,考虑枚举,可以用DFS枚举全排列,然后判断答案是否正确,因为我们从1开始枚举,本来就是最小字典序,所以有答案就直接return。也可以用next_permutation(),将前N个数放入数组,然后进行全排列循环,在里面循环判断是否符合答案。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using

2021-07-02 16:21:21 92

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除