自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 51nod 1101 换零钱 简单dp

题意:问在现有面值金额下 输入一个m可以由多少种不同的金额组成那么可以定义dp[i]表示i金额由多少种不同的金额组成方式转移方程:dp[i] = (dp[i] + dp[i-cost[j])%mod; 首先要定义dp[0] = 1; 然后枚举面值 看不同数目下该面值可以组成那些金额 然后通过状态转移累计不同的组成方式#include<bits/stdc++.h>using namespace

2017-11-29 23:46:56 174

原创 CodeForces 895 B. XK Segments 二分查找

题意定义n个数和x 让我们在这n个数中找出 多少个不同的对 分析观察条件我们要找的是对于一个元素ai 找到另外一个元素 aj 使得a[i]<=a[j] 所以我们需要排序 也就是对于每一个元素 ai 我们可以确定他后面有k个x的整数区间的范围 假设下界为lb上界为ub 那么 当a[i]除x的余数不为0:lb = a[i]+x-(a[i]%x)+(k-1)*x , ub = a[i]+x

2017-11-29 19:52:13 224

原创 The 2014 ACM-ICPC BeiJing D - Dire Wolf HDU - 5115 区间dp

题意n个狼 排成一排 我们要把一排狼都删除掉 删除一个狼的花费是这个狼的权值和左右两个狼的附加值 求最小花费分析考虑区间dp dp[i][j]表示i到j的最小花费 我们可以枚举其中的k 为序列中最后一个删除的元素 然后记忆话搜索 这样下来最深层次的元素最先删除 附加元素就是b[l-1],b[r+1] 然后回溯得到小区间的最优解 作为我们大区间的部分和从而构造大区间的最优解code#in

2017-11-28 00:01:38 245

原创 Hihocoder #1631 : Cats and Fish 模拟

题意现有n个鱼 m个猫 每条猫有吃一条鱼所要花去的时间 问最终x分钟后会有多少只完整的鱼 和不完整的鱼分析很像操作系统的资源调度的问题 这种卡时间点的问题向来都要好好把 每个步骤所发生的时间给他具体化 我们看每只猫吃一条鱼花去ci分钟 而他是在这一分钟开始的时刻开始吃的 放到时间轴里就是 0-1-2-3-4-… 、 定义时间点表示在ti分钟之后 所有猫在0时刻开始的时间点申请吃鱼

2017-11-27 15:46:47 247

原创 Mahmoud and a Dictionary CodeForces - 766D 种类并查集

题意给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES 然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出1 反义词输出2 不确定输出3分析种类并查集如果两个字符串的关系 是1 表示同义 那么分情况讨论 如果两个词的根节点相同 那么表示有关系 那么如果与根节点的关系是相同的那么没错 如果与根节点的关系是

2017-11-25 15:32:19 189

原创 POJ 1703 Find them, Catch them 种类并查集

题意给出一堆点和关系 D为两点不同集合 A为查询两点是否不同集合 n<=1e5 code#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int maxn = 1e5+7;int f[maxn],rel[maxn];int find(int x){ int t;

2017-11-25 12:31:24 139

原创 wannafly挑战赛4 C-割草机 思维

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 有一块n*m的地,每块地要么长满杂草(用’W’表示),要么是空地(用’G’表示),现在有一个人站在(1,1),面向(1,m),他可以按如下两种方式移动:1、向面朝的方向移动一格,耗费1单位时间2、向下移动一格,并反转面朝的方向(右变左,左变

2017-11-25 10:26:10 464

原创 CF Vicious Keyboard 构造水题

分析为了防止出错 这里要注意 为了防止VK判断的时候 不影响其他的判断 对于一个VK 我们最好不要把他删掉 就直接把原来的VK覆盖掉 然后对于剩下的可能 最多只能增加一个VK 就是通过 目标条件判断 #include<bits/stdc++.h>using namespace std;int main(){ string l; getline(cin,l);

2017-11-23 21:59:17 361

原创 Hihocoder 1632 : Secret Poems 思维|技巧

题意定义一个矩阵 他有n*n大小 然后给出他的真实信息的走法 让我们变换走法 再次把真实信息填入矩阵中 n<=100分析可以发现原文的读取方式无非就是如此 (0,1)向左 (1,-1)左下 (1,0)向下 (-1,1)右上 1边界检查 (1,0)向下 (1,-1)左下 (0,1)向左 (-1,1)右上 2退出检查 观察发现其中下和左移动都是1步

2017-11-23 08:27:17 334

原创 CodeForces - 766C - Mahmoud and a Message dp

题意给出一个字符串 和每个字符的限制数量ai 让我们随意的切割成多个字符串 使得每一个字符串中的特定字符所在的子串长度len<=ai 求一共有多少个符合题目要求的方案 求其中最长的一个串长度是多少 求其中最少能分成多少个串 长度最大为1000分析明显可以用搜索 不过复杂度指数级 计数问题 考虑dp 对于第i个字符 他可以考虑从i-ai+1开始往后到i分割字符 我们这里可以枚举分割的位置

2017-11-20 23:31:10 239

原创 Crusaders Quest ZOJ - 3983 构造|思维

题意给我们一个字符串 其中只有a,o,g 当三个相同字符连在一起时释放大技能 我们可以消除任意连续数量的字符  问我们最大的释放大技能的数量是多少分析首先答案只能是 1 2 3 如果这个字符串中存在连续三个的我们可以直接消去 删掉 3个的情况就是三个通过删除的过程中可以形成或是已经就是三个的情况 直接删除 当我们在构造一个字符连着的三个时 我们需要删除这个字符中间的字符 那么如果我们要寻

2017-11-18 15:12:08 648

原创 CodeForces - 888C K-Dominant Character 思维

题意找到在整个字符串中 所有以k长度的子串中的公共串至少长度为1的字符串 求出这个K的最小值是多少 分析每个子串都有的至少长度为1的公共子串 这里我们要求k的最小 那么不如就把公共串的长度考虑为1 因为如果存在一个公共串长度为k>1的串 那么他必然满足k=1时的解 所以这里不如简化问题 统计下每个字符的最长距离就可以了 求出所有出现过的字符的最长距离中的最小值  复杂度O(n)#include<

2017-11-18 13:35:15 279

原创 CodeForces 841B (B) 博弈

标题定义A把取数列中区间和为奇数的元素取出来 B把数列中区间长度为偶数的区间删除 那么谁先面临无数可拿的局面 A先取分析分析可知本题如果区间中每一个数是偶数那么B可以一次取完 则A不能取 B赢 如果区间中有奇数 那么如果奇数有奇数个 那么A可以一次性取完 A赢 如果区间中奇数有偶数个 那么A可以取奇数个奇数 偶数-奇数=奇数 剩下序列和为奇数的情况 如果序列中有偶数 B只能取其中的偶数 那

2017-11-18 12:08:25 252

原创 CodeForces 841C (C) Leha and Function 贪心

题意定义F(n,k)F(n,k)表示1-n的数列中以k为子集总个数的最小值 现有A,B数组 让我们重新排列A 使得sigma[1 len]F(ai,bi)sigma[1 ~ len]F(ai,bi)的数学期望最大分析题目看上去有点绕 但分析下其实就能发现  本题再1-n的的排列中求k个元素的子集最小数的数学期望应该是: X=1∗C(n−1,k−1)/C(n,k)+2∗C(n−2,k−1)/C

2017-11-18 11:54:00 230

原创 CodeForces 799B (B) T-shirt buying

分析本题实质上就是对数据处理一下就可以了就是数据结构实现题 我们要求对应索引下按照某种排序规则的线性表时 取最优时 可以用堆每次拿出一个元素 堆内元素调整顺序然后用三个堆 就可以表示三张表 每次我们得到顾客的一个喜欢颜色 就可以利用这个颜色去查堆 找到就输出 找不到就输出-1本题在于把对应颜色作为下标 将元素存进来用的时候就查表就行了减少遍历次数 将一张大表分成不同颜色的小表 cod

2017-11-18 11:40:07 259

原创 Codeforces Round #413 C-Fountains 树状数组

题意本题给我们给我们两种货币初始金额 每种货币分别对应能买不同种类的喷泉 每个喷泉有花费和价值 问我们如果单纯建造两个喷泉在限定金额内的最大值分析考虑一下 发现有三种情况 1 两个喷泉从coin中里建造 2 两个喷泉从diamond中建造 3 一边一个 4 输出0 表示找不出两个合法的可行解 第3,4种情况还好判断 就是在两边一遍选一个金额限度中价值最大的

2017-11-18 11:36:37 137

原创 K-Dominant Character CodeForces - 888C 思维 构造

题意让我们在这个字符串中找一定k长度的字串中都至少含有一个相同的字符 让求这个字串的最小长度分析也就是说当我们最终确定了 字串的最小长度后 每个以此长度的字串都至少含有一个相同字符 那么当我们找这个长度的时候 也就是说 每个k长度的字串中都至少出现一个相同的字符 那么也就是说 如果我们知道每个字符间距的最大距离作为这个串的必要结果 也就是说 这个所有字符最大间距的最小值就是我们需要的答案 cod

2017-11-13 21:18:00 270

原创 CF#420 B. Okabe and Banana Trees 思维|暴力|几何

Okabe needs bananas for one of his experiments for some strange reason. So he decides to go to the forest and cut banana trees.Consider the point (x, y) in the 2D plane such thatx and y are intege

2017-11-12 23:32:41 220

原创 UVa-10820 Send a Table 欧拉函数

题意交表 由于f(k∗x,k∗y)f ( k*x , k* y ) 可以由f(x,y)f ( x , y )递推出来 让我们求 在x,y都不大于n的情况下 计算最少需要计算多少不同的项 n<=50000分析那么也就是说两个数由共因子的不必计算 只计算两个数没有共因子的 那么也就是说 每个数我们只需要找到与他互质的个数就可以了 欧拉函数线性筛code#include<bits/stdc++.h>

2017-11-10 11:23:31 163

原创 codeforce 884C - Bertown Subway DFS+图论

分析题意说输入数据有两个规则: 1 每个i只有一个pi表示i站的目的地 i可以等于pi 2 每个pi都指向唯一的一个站i 那么也就是说i指向的目的只有一个且唯一 每个目的由唯一的始发站出来 所以也就是说 图中的每一个点只有一条单向边 那么当我们求最大的数量的可达对时 也就是尽可能构造大圈 所以每一个点 要么形成自回路 要么在一个多点圈中 而连接任意两个圈的花费就是修改两站的目的

2017-11-10 10:01:02 256

原创 ZOJ 3537 Cake 计算几何+区间dp

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3fffffff;struct node{ int x,y;}N[510],ans[510];bool X(node a,node b,node c){ return (b.x-a.x)*(c.y-a.y)-(c

2017-11-08 21:46:14 196

原创 CodeForces-887B 技巧DFS

标题最大不超过3个筛子 让我们从其中任选筛子组合成数据 问我们组不成的最小的数是多少分析要模拟把最大3个筛子 选出1,2,3个的情况去组合 我们可以枚举所要选的数的数量 用next_permutation得到这n个数的全排列 这样不论的选几个筛子 都会便利到所有情况 然后在把所有情况统计一下#include<bits/stdc++.h>using namespace std;bool bok[

2017-11-08 21:43:13 197

原创 HDU-1251 统计难题 map写法

#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<map>using namespace std;map<string,int>n;char a[12];int main(){ while(*gets(a)){ n[a]++; for(int i

2017-11-05 20:18:28 349

原创 Trie总结

Trie 树即为字典树 这个树可以把所有我们要在文本中所查询的前缀都记录下来 当我们拿到一个文本串 需要从里面找出所有前缀串的数目我们就可以用这个结构 拿着我们的文本到这个树里面走一走就得到有多少个前缀了我们来看 当我们拿到一个前缀 不断地把这个前缀插入到树中 对每一个节点 可以连到26个分节点去 这个树具体有两个操作 一个是add操作 还有一个就是匹配操作 Trie的头结点是空的

2017-11-05 19:57:05 150

原创 KMP

kmp字符串匹配算法 相对于bruteforce O(n*n)匹配 kmp只需要O(n)复杂度就可以找到目标串中模式串的位置我们看对于一个字符串 我们其实不需要一个一个字符地去扫描 我们可以利用模式串本身的信息去完成kmp可以用来解决循环周期一类的问题 也可以用来求匹配位置 如果字符串中存在周期串 那么这个串中必定是前n-1个周期 和后n-1个周期匹配kmp分为两部分 先求出next数组

2017-11-05 08:34:41 276

原创 HDU-4278 Faulty Odometer 数学递推 || 八进制

题意这个里程表当走到3或8的时候就会跳过 给我们这个里程表上显示的数字 让我们求这个里程表的真实数据是多少分析由于 3 和 8 不存在 那么就相当于一个八进制数 但是这个八进制中3 是写作4 8是写作9 那么就好写了 也就是把数入的“特别八进制数”转化成一个十进制数 还有一个方法就是推每一位具体是少了多少个数 做题的时候一开始想往数位dp上想 结果Z神一下就想到了递推 犇!! 通过对输

2017-11-03 16:58:05 507

原创 HDU-4282 A very hard mathematic problem 技巧枚举+二分

题意xz+yz+x∗y∗z=kx^z+y^z+x*y*z = k ( y>x&&z>1y>x&&z>1) 给我们这个等式让我们找出这里面有多少个不同的可行解分析表面上数据范围比较大 但由于k最大都在int范围内 由于后面还有一个x*y*z 于是这个式子的指数不会超过31 再来分析x和y 这里必定是一个y大x小 那么假如我们先枚举一个数 那么另一个数的范围必定就是 1~y-1 由于这个式子是

2017-11-03 11:26:09 257

原创 HDU-3998 Sequence LIS统计

题意让我们在数串统计最长长度的LIS有多少个 每个LIS元素没有重叠分析这题可以用nlogn的LIS方法水过 就是每次我们更新找到的LIS长度的时候 就把当前位置下的元素标记 表示我们把它删掉了 不断地重复找LIS的过程 最后如果找到的长度小于我们最初找到的LIS长度 就退出循环 复杂度大概在O(number of LIS * n * logn)code#include<bits/std

2017-11-02 17:29:11 178

原创 LIS 的 n*log 算法 ———二分维护

upper_bound只会替换让留在数组里的最长递增子序列尽可能小 由于upper查出来的结果下标是那个可以插入这个值得最后一个元素 所以他会把大的数变成小的数upper将可以替换成新元素的元素替换成更小的 将不能替换的元素 大的元素直接放在最后面 很神奇你会发现 这个问题 通过一个二分就能解决 如何解决的呢 我们要在vector中维护一个递增序列 如何维护 那就是每当我们遍历过程

2017-11-02 17:19:39 720

空空如也

空空如也

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

TA关注的人

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