自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 蓝桥杯 大臣的旅费(最短路)

题目地址:点击打开链接思路:就是要求一条最长路,可以从任意一点开始做一次最短路,找到最远的点,然后对这个最远的点再做一次最短路,此时最远的路就是最长路。代码:#include#include#include#include#includeusing namespace std;const int maxn = 1e4+5;const int INF

2017-02-28 22:49:38 718

原创 hdu 5248 序列变换(二分+贪心)

题目地址:点击打开链接思路:二分套路题,二分最小代价,贪心去验证是否能变成递增序列,验证时要尽可能让每个数变得最小。代码:#include#include#includeusing namespace std;const int maxn = 1e5+5;int a[maxn], n, t, ca = 1;bool judge(int x){

2017-02-28 22:16:57 764

原创 蓝桥杯 买不到的数目(递推)

地址:点击打开链接思路:dp[i]记录i是否可以凑得,所以可知dp[i] = dp[i-a] || dp[i-b网上还看到个公式:a*b-a-b....不知道怎么推出的代码:#include#include#includeusing namespace std;const int maxn = 1e7+5;int dp[maxn];int

2017-02-27 23:46:32 653 1

原创 poj 1019 Number Sequence && hdu 1597 find the nth digit(二分,模拟)

两个题很相似,都是问你第i位是几,但排列的顺序有点不太一样.hdu 1597的每个单位是前一个单位后加个1-9中的一个循环添加;poj 1019的每个单位是前一个单位后加(i+1)思路都一样,想办法记录截止到某个单位其前缀一个有几位,这样就可以二分快速找出第i位在哪个单位,剩下的就好办了。poj的比较难想,需要记录

2017-02-27 21:42:45 424

原创 uva 674 && hdu 2069 coin change(动态规划、母函数)

题目地址:点击打开链接dp[i][j]表示前i种硬币组成j元的方案数。状态转移方程:dp[i][j] = ∑(dp[i-1][j-k*v[i]]).递推递归都可以写。也可以用母函数写,注意母函数只能预处理的时候跑完,不然超时。递推:#include#include#includeusing namespace std;typedef long lon

2017-02-27 18:20:35 517

原创 蓝桥杯 剪格子 (搜索)

题目地址:点击打开链接同一部分一定是连着的,所以从左上角开始搜索即可。注意输入是先列数再行数。代码:#include#include#includeusing namespace std;const int INF = 0x3f3f3f3f;const int maxn = 15;int a[maxn][maxn], n, m, sum, ans;bo

2017-02-26 22:28:39 364

原创 蓝桥杯 打印十字图 (模拟)

题目地址:点击打开链接恶心的打印图像。慢慢绘制,因为是对称的,画好四分之一再去填充就可以了。代码:#include#include#include#includeusing namespace std;const int maxn = 150;char str[maxn][maxn];int h;void init(){ memset(s

2017-02-26 21:34:01 432

原创 poj 3252 Round Numbers(数位dp)

题目地址:点击打开链接题意:Round Numbers:二进制0比1多或者相等的数。给定一个区间,问在这个区间上的Round Numbers有多少个?思路:裸的数位dp,做过处理前导0的数位dp就没问题。代码:#include#include#includeusing namespace std;const int maxn = 35;int dp

2017-02-26 00:38:35 351

原创 poj 3258 River Hopscotch(二分)

题目地址:点击打开链接题意:一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L。河中有n块石头,每块石头到S都有唯一的距离问现在要移除m块石头(S和E除外),每次移除的是与当前最短距离相关联的石头,要求移除m块石头后,使得那时的最短距离尽可能大,输出那个最短距离。思路:二分最短距离,贪心验证可行性就行。

2017-02-26 00:11:27 422

原创 bestcoder #92 B Count the Sheep(思维)

哎 太菜了自己思路:连着的四个羊,所以有三条边,所以中间边两端点度数>1,以这条边为中间边的方案数为(cnt[u[i]]-1)*(cnt[v[i]]-1), 因为可以反过来 所以再乘2.代码:#include#include#includeusing namespace std;typedef long long ll;const int maxn = 1e5+5

2017-02-25 22:27:24 543

原创 蓝桥杯 国王的烦恼(并查集)

题目地址:点击打开链接思路:按照天数倒着建图,如果这桥连了两个新区域并且和上一次连新区域不是同一天,ans++。#include#include#include#includeusing namespace std;const int maxn = 1e5+5;int n, m, pre[maxn];struct node{ int u, v, d;

2017-02-24 13:15:15 634

原创 CodeForces - 363D Renting Bikes(二分,贪心)

题目地址:点击打开链接题意:n个人,每个人自己有一定的钱,还有公共的预算。m辆自行车,每辆车有一定的价格。求最多能租几辆车并且用的私房钱的总数最少。思路:遇到这种题总是想不到正确的思路方向。二分车辆,然后贪心验证。最后用私房钱最少就是需要买价格最低的k辆车花费和-公共的钱,注意下不能是负数。还有注意用long long。代码:#include#include#inclu

2017-02-24 11:45:55 577

原创 bzoj 1008 越狱(快速幂)

题目地址:点击打开链接思路:越狱的情况比较难计算,可以计算所有情况的总数减去不能越狱的数量就是能越狱的数量。总数:m^n不能越狱的:第一个人有m种情况,第二个人是m-1种,第三个人因为只要左右不同所以也是m-1,所以推出不能越狱的人数是m*(m-1)^(n-1)取模运算:(a + b) % p = (a % p + b % p) % p

2017-02-23 23:28:42 479

原创 hdu 4185 Oil Skimming (最大匹配)

题意:一块区域n*n,'#'表示油,'.'表示水,每次能挖1*2的矩形(横竖任意),且不能挖到水,而且不能交叉挖,问最多可以挖几下。思路:给每块油标号,相连的油建立关系,然后跑一下匈牙利,/2即为答案。代码:#include#include#include#includeusing namespace std;const int maxn = 1e3+

2017-02-23 17:01:22 517

转载 Kosaraju算法求解强连通分量

基本思路:•  这个算法是最通用的算法,其比较关键的部分是同时应用了原图G和反图GT。(步骤1)先用对原图G进行深搜记录时间结f(n)。(步骤2)选择f(n)最大的点在深搜得到各个强连通分量。•••2. 伪代码•  Kosaraju_Algorithm:•  step1:对原图G进行深度优先遍历,记录每个节点的离开时间。(即保存的是后序遍历)•  s

2017-02-23 15:06:55 1235

转载 tarjan算法求解强连通分量

转自:点击打开链接全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单!tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图的联通性,就是任督二

2017-02-23 14:02:28 1025

原创 poj 2186 Popular Cows(强连通分量,tarjan或Kosaraju)

题目地址:点击打开链接题意:给定一些有向路,求有多少个点可以由其余的任意点到达思路:第一道强连通分量题,照着白书写的。最后判断拓扑排序最后一个强连通分量是否可行看到两种方法,白书是对最后一个连通分量再逆向dfs一遍,验证是否所有点都能到达;看到网上大多的解法是计算每个连通分量的出度,若当且仅当出度为0的只有1个才符合。代码:

2017-02-22 19:49:33 729

转载 整数划分类问题求递推式

整数划分 --- 一个老生长谈的问题:  1) 练练组合数学能力.  2) 练练递归思想  3) 练练DP  总之是一道经典的不能再经典的题目:  这道好题求:  1. 将n划分成若干正整数之和的划分数。  2. 将n划分成k个正整数之和的划分数。  3. 将n划分成最大数不超过k的划分数。  4. 将n划分成若干奇正整数之和的划分数。  5. 将n划分成若

2017-02-22 18:02:36 814

原创 CodeForces 360A - Levko and Array Recovery (模拟)

题目地址:点击打开链接思路:维护每个数的上下界,先按照操作倒着求一遍,可以得到每个数的上界,再按操作正着验证一遍是否能够满足。如果都能满足的话输出上界即可。代码:#include#include#includeusing namespace std;const int maxn = 5e3+5;const int INF = 0x3f3f3f3f/10;int

2017-02-21 22:55:57 522

原创 poj 2282 The Counting Problem && poj 3286 How many 0's? (数位dp)

两个题几乎差不多,就是poj2282多求下1-9的数量,求1-9的数量和51nod的1009一样点击打开链接。数0的情况就有点不一样了,因为前导0不算在内,所以递归时要多加个判断是否是最前面的有效数字.poj2282代码:#include#include#includeusing namespace std;const int maxn = 20;int dp

2017-02-21 22:43:48 547

原创 qutoj 1357 小E与计算器(模拟)

题目地址点击打开链接比赛的时候是蒙蔽的,怎么求循环体。。。过了这么久才来补,看了看题解才发现原来这么水。。。题解:解决这一题,我们稍微一分析,就能够简化问题。因为n除以m的余数只能是0,m-1,根据抽屉原则,当计算m+1次时,至少存在一个余数相同,即为循环节。故我们只需存储余数输出即可。注意:一开始做输出超限了,因为把小数位数定了5000,余

2017-02-20 22:50:48 682

原创 51nod 1009 数字1的数量(数位dp)

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。Input输入N(1 Output输出包含1的个数Input示例12Output示例5转:点击打开链接一道基础的数位

2017-02-20 21:23:05 818

原创 hdu 4734 F(x) (数位dp)

点击打开题目注意:dp[pos][sum],sum不是存当前枚举的数的前缀和(加权的),而是枚举到当前pos位,后面还需要凑sum的权值和的个数代码:#include#include#includeusing namespace std;const int maxn = 10;const int maxm = 1e4+5;int dp[maxn]

2017-02-20 19:59:09 351

原创 hdoj 2089 不要62(数位dp入门模板)

入门题,见数位dp入门代码:#include#include#includeusing namespace std;const int maxn = 10;int a[maxn], dp[maxn][3];int dfs(int pos, int pre, int limit){ if(pos == -1) return 1; if(!limit &

2017-02-19 23:11:38 446

转载 数位dp入门详解

基础篇数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数。所谓数位dp,字面意思就是在数位上进行dp咯。数位还算是比较好听的名字,数位的含义:一个数有个位、十位、百位、千位......数的每一位就是数位啦!之所以要引入数位的概念完全就是为了dp。数位dp的实质就是换一种暴力枚举的方式,使得新的枚举方式满足dp的性质,然后记忆化就可以了。

2017-02-19 23:07:41 4757

原创 hdoj 2819 Swap (最大匹配+输出路径)

题意:给你一个每位是0或1的矩阵,问你是否可以经过交换行和交换列使矩阵的对角线都为1,如果可以输出交换的方法。思路:行和列的匹配,左边是行,右边是列,然后如果行列交点是1,那么就可以匹配,看是否为完美匹配,然后输出怎么交换的。输出交换的路径:可以从第一列开始,每次找匹配行为该列号的(即如果该列为i, 找j使match[j] == i),然后这两列进行列交换就完成了这一列,一次完成接

2017-02-19 00:15:45 743 1

转载 hdoj 2255 奔小康赚大钱 (KM算法 详解+模板)

转自点击打开链接【KM算法及其具体过程】(1)可行点标:每个点有一个标号,记lx[i]为X方点i的标号,ly[j]为Y方点j的标号。如果对于图中的任意边(i, j, W)都有lx[i]+ly[j]>=W,则这一组点标是可行的。特别地,对于lx[i]+ly[j]=W的边(i, j, W),称为可行边;(2)KM 算法的核心思想就是通过修改某些点的标号(但要满足点标始终是可行的),

2017-02-18 21:32:57 578

原创 hdoj 1281 棋盘游戏 (匈牙利,关键位置)

思路:最多棋子数就是裸的匈牙利,关键位置数的话枚举删去每条关系,看看能放最多的棋子数是否减少,若减少则为关键位置,反之不是。代码:#includeusing namespace std;const int maxn = 105;vector e[maxn];int ca = 1, n, m, k, vis[maxn], match[maxn];bool Hungar

2017-02-18 15:11:00 408

原创 hdoj 1045 Fire Net (dfs or 匈牙利)

题意:给出一个图,其中有 . 和 X 两种,. 为通路,X表示墙,在.中放炸弹,然后炸弹不能穿过墙且不能互相炸到,问你最多在图中可以放多少个炸弹?思路:因为数据很弱,所以搜索也可以过。还有个更好的方法,二分图最大匹配。难在建图,把每一行中的可以放一个炸弹的一块区域标记为同一个数字,列也一样(行和列的标记数字不要有重复)。这样每个点就有一个行标记值和列标记值,然后按照这两个数字进

2017-02-18 13:49:53 448

原创 hdoj 2444 The Accomodation of Students(裸的二分图判定+匈牙利)

题意:一些学生之间是朋友关系(关系不能传递),现在要将一堆学生分成两堆,使得在同一堆的学生之间没有朋友关系。如果不可以输出“No”,可以的话输出最多可以分出几对小盆友(最大匹配)。思路:裸的二分图判定和匈牙利算法(匈牙利算法)代码:#includeusing namespace std;const int maxn = 205;vector e[maxn];

2017-02-17 16:21:37 466

转载 匈牙利算法(简单易懂)

matrix67(点击打开链接):说穿了,就是你从二分图中找出一条路径来,让路径的起点和终点都是还没有匹配过的点,并且路径经过的连线是一条没被匹配、一条已经匹配过,再下一条又没匹配这样交替地出现。找到这样的路径后,显然路径里没被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。不断执行上述操作,直到找

2017-02-17 16:13:36 30860 5

原创 poj 2342 Anniversary party (树形dp入门)

题意:某公司,每个人都有一个直接上司(除boss外且不存在环),每个人都有一个活跃值。现要举行一个晚会,参加的人中不能有直接上司存在,问最大活跃值是多少?解题思路:任何一个人的来或不来可以看作一种决策,那么状态就是在某个人来的时候或者不来的时候,以他为根的子树能有的最大活跃总值。分别可以用dp[i][1]和dp[i][0]表示第i个人来和不来。所以可以得到状态转

2017-02-17 14:26:48 336

原创 hdoj 2204 Eddy's爱好(容斥)

http://acm.hdu.edu.cn/showproblem.php?pid=2204给定n,求1-n中有多少个可以表示成M的K次方的数。K>1题意很简单,但是怎么想?题面上说到了素数,第一想法就是K从素数开始枚举!当K不是素数时,必然是重复算过的!比如K=6时,一定会有一个(M1的2次方)的3次方=(M2的3次方)的2次方那么,最大素数是多少?n最大值是1e

2017-02-08 22:14:53 428

原创 51nod - 1284 2 3 5 7的倍数(容斥)

同hdoj 1796 点击打开链接#include#include#includeusing namespace std;typedef long long ll;ll a[4] = {2, 3, 5, 7};ll n, ans;void dfs(ll cur, ll lcm, ll id){ lcm = a[cur]/__gcd(a[cur], lcm)*l

2017-02-06 13:16:29 544

原创 51nod - 1289 大鱼吃小鱼(栈)

思路:向左走的可能会被向右走的吃,向右走的可能被向左的吃。栈中存向右的小鱼。如果当前鱼向左,则依次与栈顶鱼比较大小,如果能吃光则能存活;如果当前鱼向右,则加入栈。最后栈中鱼的数量加上向左走存活的数量就是所有能存活的。#include#include#includeusing namespace std;int main(void){ int n, a,

2017-02-06 12:01:24 982

原创 51nod - 1305 Pairwise Sum and Divide

思路:Floor((A[i]+A[j])/(A[i]*A[j])) 可知A[i], A[j]只有在两个都为2或者至少有一个是1的时候这个值才不为0,即A[i], A[j]分别为1 1时贡献为2;2 2时贡献为1; 1 x, x 1时贡献为1;其他都为0;所以统计1和2的数量即可。#include#include#includeusing namespace std;cons

2017-02-06 00:08:09 388

空空如也

空空如也

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

TA关注的人

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