ACM 常见问题
untilyouydc
月份未到你也得接受
展开
-
杭电多校赛4 HDU - 6333 Harvest of Apples
There are nn apples on a tree, numbered from 11 to nn. Count the number of ways to pick at most mm apples. InputThe first line of the input contains an integer TT (1≤T≤105)(1≤T≤105) denoting the ...原创 2018-08-01 20:17:40 · 217 阅读 · 0 评论 -
HDU 6319 Ascending Rating
Problem DescriptionBefore the start of contest, there are n ICPC contestants waiting in a long queue. They are labeled by 1 to n from left to right. It can be easily found that the i-th contestant's...原创 2018-07-30 19:30:35 · 226 阅读 · 0 评论 -
Similarity of necklaces 2 POJ - 2754(012背包)
思路:考虑先将最小的选上,最后转化为多重背包。#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <map>#include <vector>原创 2018-09-07 21:32:02 · 332 阅读 · 1 评论 -
POJ 2184 Cow Exhibition
"Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to the public that they are both smart and fun. In order to do thi...原创 2018-07-22 20:29:03 · 152 阅读 · 0 评论 -
CD UVA - 624 (背包+记录路径 两种方法解题)
题意:很简单,就是求最大值并且记录选择了哪些。方法1:dfs 记录路径。这个很好理解,原理是二进制枚举,每个数可以选或不选,有两种方式。直接枚举的话有2^n种情况。考虑剪支优化。 当剩余容量小于当前值时,不用考虑。这样的dfs写法是很经典是搜索方式。#include <bits/stdc++.h>using namespace std;const int maxn...原创 2019-01-18 19:39:50 · 329 阅读 · 0 评论 -
leetcode 474. 一和零
双重背包裸题class Solution {public: int findMaxForm(vector<string>& strs, int m, int n) { int dp[m+2][n+2]; memset(dp,0,sizeof(dp)); for(auto s:strs) { ...原创 2020-02-07 10:41:13 · 128 阅读 · 0 评论 -
Investment POJ - 2063 (完全背包)
题意:给你一笔钱,给你一个利润单,每年你可以选择去买这里的单子里面的产品,不同的产品可以赚不同的利润,每种产品可以买无数个(只要你有钱)。问n年以后,你的手里最多有多少钱。思路:这题有点啰嗦,读懂题目以后,发现是很裸的完全背包(只不过在外面套一个循环而已)。相当于是每年都进行一次完全背包计算一下最优方案。注意它提示钱数是1000的倍数。反思:这题可以提升一下阅读能力,还有就是再打一遍完全背...原创 2019-01-25 22:00:01 · 262 阅读 · 0 评论 -
Dividing coins UVA - 562(01背包)
题意:给定一堆硬币,要求分成两堆,使得这两堆的差最小,输出最小的差距。思路:问题等价于,给定一个sum/2(sum为所有的硬币价值之和)的背包,求这个背包最大能装多少东西,求出以后用sum-dp[]就是另一堆的值,再用sum-dp[] -dp[] 就可以等到两堆之间的差距了。坑点:sum可以为奇数,或偶数。所以引出了一个问题,背包的容量w到底是sum/2 还是sum/2+1?其实这...原创 2019-01-23 21:21:55 · 333 阅读 · 0 评论 -
甜点(多重背包+二进制优化)
描述小z准备举办一个比赛。他需要提供一些甜点给参赛者来补充能量。每种甜品有一定的能量ti和大小ui,且每种甜点最多有vi个。小z准备用箱子来包装甜点。箱子可以容纳一定体积的甜点且需要一定的费用。小z有一种魔法,可以将一个甜点分成多份装在箱子里,最后再合在一起(但合成之后必须是完整的一个)。小z想知道准备能量至少为P的甜点的最小大小和最少需要多少费用来购买箱子,如果最少费用超过小z所拥有...原创 2018-11-06 23:02:03 · 1054 阅读 · 0 评论 -
HDU6321 Dynamic Graph Matching(状态dp,类比于背包问题)
Problem DescriptionIn the mathematical discipline of graph theory, a matching in a graph is a set of edges without common vertices.You are given an undirected graph with n vertices, labeled by 1,2,...原创 2018-07-30 22:16:13 · 205 阅读 · 0 评论 -
饭卡 HDU - 2546(普通背包)
第二次刷题。之前刷题太功利了,现在刷题不为竞赛,只为更好的理解算法! 题意:给你w元钱,食堂里有n中菜,只要你确保卡里还有5元钱以上,那么你就可以买菜,不管价格是多少。问最多消费是多少。 思路:因为有5元钱这个限制,其实我们很难直接用背包来做。那么我们先考虑一下贪心的思路。价格最贵的菜,我肯定是想留在最后花5元去买了,这样一定是最有利的!那么我们留下5元钱以后,剩下w-5元...原创 2019-01-18 18:35:45 · 154 阅读 · 0 评论 -
Space Elevator POJ - 2392(多重背包)
题意:给定k种类型的砖头,每种砖头有3个属性,分别是高度,最大高度,数量。其中最大高度表示用这种砖头建的台阶最大高度不超过它。求利用这些砖头可以搭成最大高度的台阶。分析:有数量,有最大值,明显的多重背包。但是每种类型都有最大高度限制。这怎么办?思路:这里的最大高度限制类比到背包里不就是容量限制吗? 所以将最大高度限制设置成背包容量就行了。不过这里还需要一定转化,那就是选砖头的时候,一定是先...原创 2019-01-28 10:34:42 · 324 阅读 · 0 评论 -
Cash Machine (多重背包+二进制优化)
A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount. The machine uses exactly N distinct bill denominations, say Dk, k...原创 2018-07-31 19:35:28 · 282 阅读 · 0 评论 -
HDU - 2191 (多重背包)
题意:给定m种物品,每种物品有价格,重量,数量。你有n元钱,求用这n元钱能买到的最多的重量。思路:非常明显的多重背包裸题。这样的题目应该在2分钟之内打出来,因为就是01背包+2进制优化。这里的二进制思想非常精妙,假设一种物品有7个,那么将其分成1,2,4这三种不同数量的物品,在这三种里面随便选(每种可以选或不选)-----01背包思路。因为(1,2,4可以组成1到7之间的任意一个数)。...原创 2019-01-25 21:28:53 · 400 阅读 · 0 评论 -
LeetCode 214. 最短回文串(马拉车算法)
https://leetcode-cn.com/problems/shortest-palindrome/策略很容易看出来,只要求出以s[0]为起点的最长回文子串长度就行,因为以s[0]为起点的最长回文子串已经满足了回文串的要求,接下来只需要在前面加上s剩余部分的逆序即可。即将s分成s1+s2,其中s1为以s[0]为起点的最长回文子串。最后答案就是 s2^ + s (s2^表示s2的逆串)那么下面难点就是判断s[0]-s[i]是否能构成回文串。如果令i=0.....n,依次去判断的话,复杂度原创 2020-08-29 23:09:42 · 451 阅读 · 0 评论 -
Conscription POJ - 3723
题目本身不难,但好像题意有点难懂。给了N个男生,M个女生。要招募这(N+M)个人,需要花费1000*(N+M)。但现在男生和女生直接可以有一种联系,这种联系的数值为di,如果你想招募x,并且y与x 相连同时y已经被招募(其实即使y没有被招募,你也可以选择先花10000招募y,然后y就变成被招募状态了),那么你可以减少di元。因此,我们可以将招募的人统一用并查集合并,如果某条边的两个点x,y,不在同一集合时,代表这条边的值可以被减少。所以,最佳的做法就是每次选择权重最大的边,即用最小生成树的算法来原创 2020-08-28 23:00:20 · 249 阅读 · 0 评论 -
dfs解决八皇后问题
在复习数据结构的时候,发现这了这个问题。之前好像也做过,刚刚自己推了一下,发现有个规律,所以决定写一下。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。保证不在同一行,其实很简单,只要按行枚举就行,因为每一行只能放一个。保证不在同一列,也很简单,开一个vector记录一下之前的棋子放的位置,遍历一下,保证...原创 2020-05-01 22:33:25 · 634 阅读 · 0 评论 -
Straight Master Gym - 101775J (差分的应用)
思路:以前没做过差分的题目,这题想不到用差分,感觉很神奇。思路:构造差分序列b【i】=a【i】-a【i-1】,比如1 3 2 5 1的差分序列就是1 2 -1 3 -4,这样将区间【l,r】内的所有数减一相当于把b【l】减一, 把b【r+1】加一,基于这个思想我们从左到右扫整个序列,遇到正数就找他右面离他最近的负数,把这个负数尽量变为0,变为0后若正数还有剩余,就继续往右找负数直到这个正数用...原创 2018-10-05 21:21:48 · 279 阅读 · 0 评论 -
hdu 6393 Traffic Network in Numazu
Problem DescriptionChika is elected mayor of Numazu. She needs to manage the traffic in this city. To manage the traffic is too hard for her. So she needs your help. You are given the map of the ci...原创 2018-08-13 23:29:50 · 343 阅读 · 1 评论 -
求一个序列排好序的最少交换次数
问题描述:给定一个序列, a1,a2,a3....an,将其按从小到大排列,那么最少的交互次数是多少?例如 2 1 3 到 1 2 3的最少交换次数是1,3 1 2 的最少交换次数是2.思路:将数组sort,记录下对应的位置。在原数组中,每个元素添加一个出边指向它最终的位置,这样画完出边后,最少会成一个环,最多n个环。 然后原理就是,最少交换次数=结点数n-形成的环数。代...原创 2019-04-02 22:38:36 · 2519 阅读 · 1 评论 -
蓝桥杯 基础练习 十六进制转八进制
http://lx.lanqiao.cn/problem.page?gpid=T51题意:将16进制数转化为8进制数思路:由于字符串比较长,所以只能通过字符串模拟来做。先将16进制转为2进制,再逆序将2进制转化为8进制。这么做的原因是:每4位二进制刚好对应一个16进制数,每3个二进制数刚好对应一个8进制数。反思:这题虽然简单,但是却可以很好的复习java基本语法,栈,map,Strin...原创 2019-03-23 14:01:00 · 177 阅读 · 0 评论 -
在线离散化
我们以前遇到需要离散化的题目,大部分都是先对原数组排序,再unique,然后二分,进行离散化。这里介绍一种在线的离散化方法,那就是利用mapmap<int,int> mp;int Hash(int x){ if(mp.find(x)==mp.end()) mp[x]=tot++; return mp[x];}...原创 2018-07-15 17:41:19 · 367 阅读 · 1 评论 -
ACM 博弈 SG函数
要理解SG函数,首先要先知道SG的定理:Sprague-Grudy定理:令N = {0, 1, 2, 3, ...} 为自然数的集合。Sprague-Grundy 函数给游戏中的每个状态分配了一个自然数。结点v的Grundy值等于没有在v的后继的Grundy值中出现的最小自然数.形式上:给定一个有限子集 S ⊂ N,令mex S(最小排斥值)为没有出现在S中的最小自然数。定义mex(minimal...原创 2018-05-31 17:35:25 · 647 阅读 · 0 评论 -
数位DP+离散化 Beautiful numbers
题目:Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits. We will not argue w...原创 2018-06-21 17:09:48 · 188 阅读 · 0 评论 -
分解质因数与二分查找
分解质因数在判断两个数能否整除的问题中经常遇到,下面通过一个题目来引出分解质因数的模板口算训练Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 402 Accepted Submission(s): 81Problem Descri...原创 2018-05-30 20:27:52 · 369 阅读 · 0 评论 -
带权并查集模板题详解
1. 题目描述TT and FF are ... friends. Uh... very very good friends -________-b FF is a bad boy, he is always wooing TT to play the following game with him. This is a very humdrum game. To begin with, TT s...原创 2018-06-21 00:27:29 · 962 阅读 · 0 评论 -
ACM 常用位运算操作
运算方法有六种:& 与运算 | 或运算 ^ 异或运算 ~ 非运算(求补) >> 右移运算 << 左移运算运用这些基本的运算,我们可以解决acm所需的各种运算,给Bit赋1,赋0,给他的值取反,还有好多段操作。如下:功能 | 示例 | 位运算----------------------+---------------------------+-------------...原创 2018-05-24 14:52:31 · 1540 阅读 · 0 评论 -
ACM 可持久化线段树(静态查询) 模板
可持久化线段树的几个关键点:1. 对应每个叶节点都建立一颗树,但是一些节点可以重复利用。2. 节点维护的是这个区间的数的个数3. 通过离散化以后,叶节点是一排有序的数,所以可以使用2分的方法查找区间的第k大的数下面是模板代码及其注释:#include <iostream>#include <stdio.h>#include <vector>#include...原创 2018-05-21 22:13:06 · 174 阅读 · 0 评论 -
ACM树状树组模板及应用详解
数状数组是一种很有用的数据结构,模板代码非常简单,只要知道如何运用,就可以轻松的掌握了。下面给出数状数组的模型:它的原理是利用了计算机的位运算的小技巧和前缀和的概念,也就是说,将我们有的数据作为叶子节点,同时用一个前缀数组来维护前缀和,这样,在我们求某一区间的和时,会非常的方便。下面给出代码的模板:int lowbit(int x) //==2^k k为从最低位到最高位,连续0的长度{ ...原创 2018-05-20 21:24:22 · 713 阅读 · 0 评论 -
ACM 常用算法
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法: (1...转载 2018-09-07 18:18:32 · 296 阅读 · 0 评论 -
优先队列优化最短路+记录所有最短路径
普通的最短路做法是n^2的复杂度,利用优先队列实现可以优化到n*logn 的复杂度。记录所有路径需要记录反向边,dfs搜索一次,并用set记录即可。具体实现看代码:#include <bits/stdc++.h>using namespace std;const int maxn=100;typedef long long ll;struct Edge{ ...原创 2018-10-17 23:06:03 · 1320 阅读 · 0 评论 -
Minimum Inversion Number HDU - 1394(树状数组求逆序对)
题意:给定一组连续的数,数字为0到n-1。每次将第一个数放在最后,形成一个新的序列。这样一共可以形成n个序列,求这n个序列中逆序对数最少的是多少?题意解释:假设给定n=5,初始序列为 4 0 2 3 1 那么可以形成 0 2 3 1 4 2 3 1 4 0 ...原创 2019-01-30 20:29:48 · 183 阅读 · 0 评论 -
你真的理解树状数组吗?
首先,树状数组是一种特殊的后缀和。我之所以称它为特殊的后缀和是因为,一般的后缀和我们是这样计算的。下面设sum[]为后缀和数组,a[]为原数组sum[2] =a[1]+a[2]sum[3]=a[1]+a[2]+a[3]sum[4]=a[1]+a[2]+a[3]+a[4].................而我们的树状数组一般是这样表示的,我们用c[]来表示。C[1]=A[...原创 2019-01-30 17:44:33 · 275 阅读 · 0 评论 -
素因子去重(蓝桥杯练习题1)
题目链接问题描述 给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1输入格式 一个整数,表示n输出格式 输出一行,包含一个整数p。样例输入1000样例输出10题意已经很明显了。思路:这题主要考两个点。1. 会对一个数进行分解2. 能写出o(n)的素数递推表所以先把数进行分解以后,在选出是素数的数...原创 2019-01-29 20:10:19 · 4600 阅读 · 12 评论 -
深入理解线性素数筛------以后再也不用模板了
线性素数筛也算是一种基本的算法吧,和背包一样,必须要做到深入理解其原理,并且能快速打出代码来。两个大前提:1. 自然数中,1既不是素数也不是合数。(小学知识)2. 一个合数一定能分解成一个素数和另一个数相乘。(这个我不能证明,但是科学应该不会有错) 先从普通的思路谈起。如果问你一个数是不是素数,那你一定是for循环一下,看看有没有数能够整除它。现在,如果我们已经知道一个...原创 2019-01-29 19:54:12 · 1102 阅读 · 0 评论 -
Japan POJ - 3067(树状数组)
题意:在日本的东西两侧,分别有n,m座城市,这些两个城市之间由一条公路连接。两边的城市都由北向南从1开始编号。题目将会给出k天路,问这k条路一共有多少个交点。 思路:这题非常灵活,先将这些路按x升序排列,排好以后从最小的x开始遍历,因为x是按序排列,所以能不能有交点,只需要看y的大小即可。按x排序结束以后,就变成了对y数组进行求逆序对了。 代码:#include <...原创 2019-01-31 17:35:39 · 276 阅读 · 0 评论 -
算法作业(装载问题)
实验六 装载问题###问题描述与实验目的:有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中第i个集装箱的重量为wi,要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。注意,在满足的条件下才可能将这个集装箱装上这2艘轮船。###输入输入有若干组测试数据(不超过20组)。每组测试数据有3行:其第1行上是集装箱个数n,(n<20),第2行...原创 2018-10-31 17:36:15 · 3561 阅读 · 0 评论 -
算法作业 (最短路+记录全部路径)
思路:采用n*logn的优化迪杰斯特拉算法,求出最短路,反向建图以后,在dfs搜索即可,用set+vector记录路径,注意vector的传递需要加引用(用string 就不用加引用)。实现非常简单,直接看代码就行。#include <bits/stdc++.h>using namespace std;const int maxn=100;typedef long lo...原创 2018-10-31 16:14:34 · 1251 阅读 · 0 评论 -
跳马问题(算法作业)
#实验五 跳马问题 ###问题描述与实验目的: 给定8*8方格棋盘,求棋盘上一只马从一个位置到达另一位置的最短路径长。注意马是走“日”形的。###输入输入有若干测试数据。每组测试数据仅1行,每行上有2个方格pos1、pos2,之间用一个空格隔开,每格方格表示棋盘上的一个位置,该位置由表示列的1个字母(a-h)及表示行的一个数字(1-8)构成,如“d7”表示第4列第7行。###输出...原创 2018-10-25 15:29:22 · 10815 阅读 · 0 评论 -
ACM 离散化处理技巧
使用STL算法离散化: 思路:先排序,再删除重复元素,然后就是索引元素离散化后对应的值。 先介绍几个STL函数:1. unique():unique的作用是“去掉”容器中相邻元素的重复元素(不一定要求数组有序),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址.由于返回的是容器末尾,所以如果想得到去重后的size,需要减去初始地址用法:sz = unique(...原创 2018-05-16 23:27:18 · 1726 阅读 · 0 评论