自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JeremyGJY的专栏

I'm OIers 大家施舍点评论吧

  • 博客(42)
  • 资源 (1)
  • 收藏
  • 关注

原创 【图论】【二分图匹配】[Ural 1109]Conference

我的博客上的第一道Ural的题目呢。。 首先可以发现假设现在只有kk对人可以两两配对,那么剩下的必定还要建立n−2kn-2k条线路那么如果要ans=n−2k+kans=n-2k+k尽量小,那么我们需要的就是让n−kn-k尽量小就是让kk尽量大,那么久转换成了二分图的最大匹配问题#include <cstdio>#include <cstring>#include <algorithm>//#

2015-07-28 16:01:33 460

原创 【图论】【二分图匹配】[POJ 1325]Machine Schedule

可以发现如果把一条边看作一个任务,那么连接的就是两台机器的模式的编号,那么问题就转化成了最小的点覆盖问题,那么注意特殊处理存在一个任务在任意一台机器中是0的情况,因为一开始大家都是0,那么如果存在一个0直接不考虑这个任务就行了。#include <cstdio>#include <cstring>#include <algorithm>//#include <conio.h>using na

2015-07-28 15:57:02 474

原创 【图论】【二分图匹配】[POJ 1422]Air Raid

这道题目不用我说什么了吧,裸的最小路径覆盖问题(还有其他方法=》出门左转网络流)然后对于这道题目而言就是每一个点差点分成两个,一个进一个出,那么显然二分图匹配,每一个点只能一进一出,那么匹配出来的边的数量就是当前这个图上有多少条边可以缩成一个点,那么直接ans=|V|-ans'ans=|V|-ans'就好了。#include <cstdio>#include <cstring>#include

2015-07-28 15:50:41 551

原创 【图论】【二分图匹配】[POJ 3041]Asteroids

首先这道题目可以发现我们可以发现如果集合SS表示所有需要被覆盖的点的行和列的集合那么我们的任务就是从SS中选出一个子集使得size(S′)size(S')最小同时S′S'可以覆盖所有的点。那么如果我们选择了一个行那么和当前行相关的所有的列都有可能不被再选,那么将当前行和当前行上所有点的列连接,那么我们求得就是一个最小点的覆盖集,那么ans=ans′ans=ans'#include <cstdio>

2015-07-28 15:43:52 399

原创 【图论】【二分图匹配】[POJ 3041]I'm Telling the Truth

直接连接每一个孩子和他们所描述的区间的每一个点,然后做一次最大匹配(因为要说谎的人最少),做的时候要倒着做,因为要最大方案,然后出来检查一下每一个点是否为匹配点,保存一下输出就好了。#include <cstdio>#include <cstring>#include <algorithm>//#include <conio.h>#include <iostream>#include <v

2015-07-28 15:32:18 466

原创 【图论】【二分图匹配】[POJ 3692]Kindergarten

首先我们要求的是一个完全图,那么因为男生之间互相认识,女生之间互相认识,那么我们只考虑男生和女生认识的情况,我们要选择一个大家都互相认识的出来,那么做当前图的补图可以发现如果两个点之间有直接关系,那么这两个点一定是互相不认识的,如果没有,那么一定是认识的,所以选出的点在当前图中不能互相接触,那么求得就是二分图的最大独立集那么ans=|V|−ans′ans=|V|-ans'#include <cstd

2015-07-28 15:28:03 433

原创 【图论】【二分图匹配】[HDU 2819]Swap

首先可以很容易的发现一个性质:无论怎么交换行和列,每一行每一列的元素数量始终不会改变,那么就像八皇后问题一样,只不过改成了棋盘上放了n个车不能互相冲突。那么每一个1的位置代表可以放一个车,每一个0的位置代表不能放车,那么可以发现如果在当前位置可以放个车并且放了的话,那么就不能在当前车的行和列上继续放车了,那么给行和列编号把有1的位置行和列连接起来,然后就做二分图匹配,因为是在棋盘上放车那么始终不会超

2015-07-28 15:24:39 738

原创 【图论】【二分图匹配】[ZOJ 1654]Place the Robots

首先因为草坪并不影响互相攻击,所以应该把整个图每一行按照墙分成不同的连通块并且编号,同理编号竖向的连通块,但是因为机器人不能放在草坪上所以只有当两个连通块的交点的地方为空地的时候机器人才能够站立,那么按照http://blog.csdn.net/jeremygjy/article/details/47087593改一下数据范围改一下建边的时候检查一下是否为空地就好了。#include <cstdio

2015-07-27 17:36:17 425

原创 【图论】【二分图匹配】[ZOJ 1002]Fire Net

这道题目就是对不同的方向的同一行或者列的连通块进行标号,然后对方向不同且相交的连通快连边,最后做一次二分图最大匹配就好了。#include <cstdio>#include <cstring>#include <algorithm>//#include <conio.h>using namespace std;const int MAXN = 4;bool vis[MAXN*MAXN*M

2015-07-27 17:02:24 934

原创 【图论】【启发式搜索】【二分查找】[POJ 3897]Maze Stretching

启发式搜索主要就是加速,其实不用也可以过。二分L然后每次看最短路是多少,估价函数就是曼哈顿距离,然后注意精度误差就好了Tip:在POJ上交这道题目记得用c++千万不要用g++#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <queue>using namespace std

2015-07-27 14:44:03 664

原创 【图论】【二分图匹配】[BZOJ 1085]完美的牛栏

二分图匹配裸体,模板题。#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>using namespace std;const int MAXN = 500;const int MAXM = 50000;struct node{ int v; node *next;}Edg

2015-07-27 14:39:31 1315

原创 【启发式搜索】[HDU 1372]Knight Moves

其实直接用BFS好像也可以AC但是用了A*可以更快,所以为了练习A*还是用A*老老实实写吧。估价函数就是到终点的曼哈顿距离除以3因为每走一步曼哈顿距离最多减少3,而且在所有情况下h(n)<=h∗(n)h(n)<=h^*(n)所以该估价函数成立。#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#inc

2015-07-26 15:22:23 752

原创 【暴力搜索】[HDU 1175]连连看

这倒题目我看到很多人都用的bfs或者dfs但是其实并不用啊,首先可以发现如果不拐弯,那么A点和B点一定在同一条直线上(这种情况可以不用考虑,等下讲为什么)然后如果存在拐一次的情况那么一定是A和B所在的数轴的交点(也可以不用考虑)但是如果要拐两次呢首先A和B一定形成了一个矩形(假设AB不在同一条数轴上)那么这个拐弯一定平行于这个矩形的一条边(自己想想为什么)然后每一次check枚举一下行和列就好了共线

2015-07-24 16:42:00 841 3

原创 【暴力搜索】[HDU 1016]Prime Ring Problem

这道题太简单不多赘述。打个表,随便搞。。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int prime[40] = {0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0

2015-07-24 16:35:32 455

原创 【暴力搜索】[HDU 1518]Square

先说好,我的程序速度很慢1018ms。。其实就是算出总长度除以4然后搞一下和http://blog.csdn.net/jeremygjy/article/details/47043161一样的剪枝就好了。#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <vector>usi

2015-07-24 16:33:33 479

原创 【暴力搜索】[POJ 1011]Sticks

首先这道题目有两个非常重要的剪枝1、如果当前放的是木块的第一个那如果当前dfs不成立,那么直接返回false因为每一个木板必定属于一个块,当他放第一个的时候如果可以放其他的其实是已经固定了的了,如果当前不成立那么不存在队友可以和他一起站对。2、就是如果当前这个和前一次进行dfs的木板长度一样,就跳过。#include <cstdio>#include <cstring>#include <alg

2015-07-24 16:29:13 655

原创 【图论】[BZOJ 1051]受欢迎的牛

题目问的是有多少个牛收到所有的牛的喜欢,因为这道题目具有传递性,所以在有向图上找出强连通子图,可以发现每个子图中的奶牛一定是互相喜欢的,所以不用考虑这样的情况(把每一个强连通子图找出,缩点)然后整个图就变成了有向无环图,那么同一个点必须受到其他所有奶牛的喜欢,那么它不能喜欢任意的除了自己这个联通子图的牛的其他牛(会形成环)所以统计一下是否存在出度为0的点就好了,但是如果存在两个或两个以上的出度为0的

2015-07-24 10:20:40 675

原创 【图论】【启发式搜索】[POJ 2449]Remmarguts' Date

实际上就是从T到当前节点的最短路的长度,因为首先要保证h(n) <= h*(n)且h(n)尽量接近h*(n)那么直接令h(n)=h*(n)就行了,然后注意每一次判断是否到达终点的时候要在每一次取出的时候判断,因为这个时候的最短路是经过优先队列的排序的。还有就是注意下S==T的情况默认的时候S到本身的最短路肯定是0,那么我们如果要求现在的最短路那么求得就是当前的次短路,让k++就好了#include

2015-07-23 17:17:04 511

原创 【树链剖分】[BZOJ 4196]软件包管理器

实际上就是个树链剖分,每次询问自己需要的到根节点中有多少开/开了,然后根据需要输出然后线段树Update的时候改一下改成每次更新全部,直接覆盖就行,每次扫描出来的一段肯定是上面半段开下面半段不开(分成两段)或者全部都处于开或者关,因为在链上任意一个处于开启状态那么之前的必须也处于开始状态。就是这样。#include <cstdio>#include <algorithm>#include <cs

2015-07-23 16:43:36 460

原创 【启发式搜索】[POJ 1077]Eight

八数码问题,用的A*解决,但是数据太强A不了。。。TLE只能在POJ上先过一发了。#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>#include <vector>#include <queue>#include <stack>#include <iostream>#include <

2015-07-23 15:58:22 645

原创 【启发式搜索】八数码问题

首先就是f(n)=g(n)+h(n)这个h(n)就是估价函数,然后每次更新一下g(n)然后用康托展开,搞一下判重就好了。#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>#include <queue>using namespace std;const int MAXVIS = 100000

2015-07-23 13:37:25 1477

原创 【图论】[POJ 2942]Knights of the Round Table

先找连通图,然后检查是否是二分图注意如果是在线的算法记得要清空Color数组因为存在一种情况儿子中含有两个连通图,那么自己儿子中就会存在一个割点已经被染了色,就有可能存在冲突。#include <cstdio>#include <algorithm>#include <stack>#include <iostream>#include <vector>#include <cstring>

2015-07-23 11:08:43 407

原创 【暴力搜索】分数分解

直接搜索从0开始一直到1,然后搜索过程中只能有一个分母大于m所以,如果当前是sum,已经枚举了k个那么sum+n−km>1sum+\frac{n-k}{m}>1这种情况显然不成立,还有就是当sum+n−k+1ak−1<1sum+\frac{n-k+1}{a_{k-1}} <1实际上就是当前一直加上最大的分数还小于1,那么显然不成立。。没了#include <iostream>#include <c

2015-07-23 08:37:31 943

原创 【暴力搜索】【动态规划】[NOIP 1999]邮票面值设计

其实就是枚举每一个邮票的面值记得保持严格递增,然后DP判断每一次最多能够凑出1-哪个面值的邮票,然后下限显然就是前面一张邮票的面值+1,上限是当前能够凑出的邮票的面值+1因为显然如果当前最大为nn那么如果这张面值为n+2n+2那么显然n+1n+1不能由原来的组合构成(原来只能弄出nn)那么现在新加入了一个只会变得n+2>n+1n+2>n+1那么显然n+1n+1永远凑不出来,那么显然同理不能选择大于n

2015-07-22 15:49:36 2403

原创 【暴力搜索】[NOIP 2004]虫食算

首先把每一个式子上的字母按照从右到左,从上到下的顺序存储下来,依次枚举每一个字母分别代表哪一个数字,然后每一次check一下当前的方案是否可行,只用考虑当前一列三个数字都知道了的情况,然后就是这样还有一个优化关键就是枚举数字的时候倒着枚举,具体原因我也不知道,反正就是要快一些。。。#include <cstdio>#include <cstring>#include <vector>#incl

2015-07-22 15:19:37 1390

原创 【暴力搜索】[POJ 1186]方程的解数

实际上就是另f(Dep,Sum)f(Dep, Sum)表示当前已经算到了第i位,然后当前得到的值是SumSum的所有的方案数量,那么可以发现∑xDep−1=1Mf(Dep−1,Sum−kDep×xPDepDep)=f(Dep,Sum)=∑xDep+1=1Mf(Dep+1,Sum+kDep+1×xPDep+1Dep+1)\sum_{x_{Dep-1}=1}^{M}f(Dep-1, Sum-k_{Dep

2015-07-22 15:15:33 932

原创 【图论】[ACM]嗅探器

就是按照一个点作为根然后再这上面搞一下寻找割点,如果找到了,判断另一个点是不是在当前的割点的子树中(是相对于当前子树而言是一个割点)。如果在,那么就更新ans为最小值就行了#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <iostream>using namespace std

2015-07-22 09:11:38 491

原创 【图论】[Tyvj 1153]间谍网络

实际上就是先找出整个图里面的强连通分量,然后在每一个强连通子图里面,如果有可以受贿的罪犯,那么当前值就是最小的受贿的代价,否则就是INF, 然后在有向无环图中搞DP就好了。#include <cstdio>#include <algorithm>#include <stack>#include <iostream>#include <vector>#include <cstring>us

2015-07-22 09:06:26 426

原创 【暴力搜索】[UVa 11212]Editing a Book

就是纯暴力,每次枚举起点中点和向后移动的步数,加上if(dif(now) + 3 * (u-1) > 3 * maxd) return false;优化dif(now)表示每一位的后面是否是正确的#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct State{int s[11];}

2015-07-21 09:38:06 109

原创 【动态规划】【状态压缩DP】[UVa 1354]Mobile Computing

其实就是枚举一下每一次左边的用那些右边的用那些,处理一下当前所有组合的左端点和又短点就行了#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <iostream>using namespace std;const int MAXN = 6;typedef pair<double

2015-07-17 22:27:31 996

原创 【动态规划】【树状数组】[USACO2011 FEB]奶牛抗议

这道题目的关键就是想到用树状数组对DP进行优化,首先令f(i)f(i)表示分到第i个的时候子段和大于等于0的时候出现的最大的种树, 那么可以发现f(i)=∑f(j)|sum(i)−sum(j)≥0f(i)=\sum f(j) | sum(i)-sum(j)\ge 0那么后面的部分可以变成sum(i)≥sum(j)sum(i)\ge sum(j)那么就可以使用树状数组进行维护,下标就是sum(j)su

2015-07-17 22:10:07 766

原创 【动态规划】[USACO2011 OPEN]修剪草坪

这道道题目就是个动态规划另f(i)f(i)表示在i的位置上的时候的最大值那么f(i)=sum(i)+max{f(j)−sum(j+1)}f(i)=sum(i)+max\{f(j)-sum(j+1)\}那么发现如果j超出i-k-1的范围就没有意义了,用单调队列优化一下就好了#include <cstdio>#include <algorithm>#include <cstring>#includ

2015-07-16 14:41:54 1137

原创 【动态规划】[UVa 1099]Sharing Chocolate

实际上就是另f(S,i)f(S, i)表示在集合S中的所有面积的巧克力能不能被组成一个长高为ii的大的巧克力,那么显然 长宽是可以交换的那么只考虑高小于宽的情况就行了。那么f(S,i)=f(S−S0,min{i,Sum[S−S0]/i})f(S, i)=f(S-S_0, min\{i, Sum[S-S_0]/i\}) 同时f(S0,min{i,Sum[S0]/i})f(S_0, min\{i, Su

2015-07-16 14:36:44 558

原创 【动态规划】[UVa 11825]Hackers' Crackdown

这道题目用DP来搞首先题目可以看成把所有的计算机分成很多组每一组的都关闭同一种服务,同时这一组的关闭能够关闭所有的计算机,那么另SS为当前的所有计算机的集合另S0S_0为SS的子集另全集(所有计算机)为S′S'那么可以很容易的发现f(S)=max{f(S0)+(S′==cover(S0))}f(S)=max\{f(S_0)+(S'==cover(S_0))\}其中cover(S0)cover(S_0

2015-07-15 17:34:45 444

原创 【动态规划】[POJ 2288]Islands and Bridges

这倒题太坑了。。。简直。。。明明没有错误的代码就是A不了。。 题目分析另f(state,i,j)f(state, i, j) 表示在状态为state的情况下当前在i点前一个点是j点的所能够得到的最大的乘积那么很容易发现f(state+(1<<k),k,i)=f(state,i,j)+v[k]+v[k]×v[i]|G[j][k]=0f(state+(1<<k),k,i)=f(state,i,j)+v

2015-07-15 16:57:21 439

原创 【动态规划】【树形DP】[BZOJ 1040]骑士

首先可以发现肯定这个图是一个森林,而且在这个森林之中只有一个环,那么只要找到这个环上的任意一条边(删掉这条边)然后对这条边的两个端点分别作两次最大独立集,然后分别取两个点中不取的情况的最大值,然后这个值就是要找的了,因为只有一个环,所以我找环的方法是用并查集的方法。。#include <cstdio>//#include <conio.h>#include <algorithm>#includ

2015-07-15 10:44:38 503

原创 【动态规划】【树形DP】[UVa 10859]Placing Lampposts

首先很容易可以得到另f(i,j)f(i,j)表示第i盏灯的父亲是否点亮所以j=0|1j=0|1如果父亲放了,那么自己放或者不放都可以那么f(i,j)=max{∑f(ison,0)∑f(ison,1)}f(i,j)=max\{\sum{f(ison,0)}\sum{f(ison,1)}\},如果父亲没有放置,那么自己必须放那么f(i,0)=∑f(ison,1)f(i,0)=\sum{f(ison,1)

2015-07-15 10:28:16 513

原创 【动态规划】[POJ 1742]Coins

这道题代码很短,实际上就是令dp(i)dp(i)表示是否可以组成i这么大的面值然后sum(i)sum(i)表示当前组成i这么大的数字用了多少个当前的数字,然后循环的时候维护sum的值不超过可用范围就行了#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAXN = 1000

2015-07-13 14:09:11 451

原创 【动态规划】[UVa1625]Color Length

分析一下发现如果每一次放进去一个新,它就会对所有覆盖这个点的所有颜色的L加1那么另add(i,j)add(i,j)为第一个放到i第二个放到j放完之后这种状态有多少组交叉那么有int add(int x, int y) { int cnt = 0; for(int i=0;i<26;i++){ if(pos[i][1] <= x && pos2[i][1] <= y)

2015-07-13 14:02:43 542

原创 【动态规划】[POJ 1229]Wild Domains

其实就是把每一部分的内容缩成一个点,然后把每一个特殊意义的符号用方便表示的符号表示出来 比如 (@表示必须选一个, #表示选择1个或者不选,的含义和*一样)  ! -> @@#       * ->的含义和*一样) ! -> @@# * -> ? -> @## 然后if(check(str[0][i][0]) || check(str[1][j][0])){

2015-07-13 13:56:54 500

Cena 评测系统

Windows下评测系统,使用文件输入输出

2015-03-10

空空如也

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

TA关注的人

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