04 2012 档案

摘要:经典的树形游戏的博弈题目给定一棵树,虽然是规定给定一棵根为1树,但数据给的是树枝,所以是无向的,坑爹啊View Code #include<iostream>#include<algorithm>#include<string>#include<vector>using namespace std;const int N = 100000+10;vector<int> g[N];bool vis[N];int w[N];void dfs(int u){ vis[u]=true; int size=g[u].size(); w[u]=0 阅读全文
posted @ 2012-04-20 13:46 枕边梦 阅读(228) 评论(0) 推荐(0)
摘要:题意很浅显,给定当前下载任务的已选状态和最终状态,可以当过单选,全选,反选等三个操作达成,问最少的操作数分析:思维真的有很大的局限性,怎么就没想到去整理一下规律呢,一心只想着搜索,dp呀,虽然这俩方面都很水……看了大牛的解释,我也跟着恍然大悟了……View Code #include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ char S[55],T[55]; int i,j; int Min,count[4],n; while (scanf("%d",& 阅读全文
posted @ 2012-04-17 21:11 枕边梦 阅读(198) 评论(0) 推荐(0)
摘要:pku2899 Jamie's Contact Groups题意:在通讯录中有N个人,每个人能可能属于多个group,现要将这些人分组m组,设各组中的最大人数为max,求出该最小的最大值分析:二分group的最大值,+二分图多重匹配View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 1000+10;const int M = 500+10;int n,m;int map[N][M],vlink[M],link[ 阅读全文
posted @ 2012-04-15 15:51 枕边梦 阅读(1709) 评论(0) 推荐(0)
摘要:很明显的一个二分图多重匹配,一开始用网络流直接建图,悲剧的TLE了之后,看了网上解释,缩点,确实大大简化了问题,也就可以AC了,600+ms一开始是这样建图的,先有虚拟源点s,汇点t,从s向每一个人连一条容量为1的边,每一个人向他适合的每一个planet连一条容量为1边,再从每一个planet连一条容量为w[i](该planet的容量)的边,很明显,判断最大流是否等于n即可。n为100000,而m只有10其实,在这道题目里面,人是无差别的,有区别是他们各自的选择,而总共只有10个planet,也就是所有的选择数也就(1<<10)种,所有选择都相同的人完全是等价的!!!可是,没想到还 阅读全文
posted @ 2012-04-15 14:34 枕边梦 阅读(1306) 评论(0) 推荐(0)
摘要:网上很多用线段树做的,,好复杂,,,这个是用纯STL做的,map+set转自http://blog.csdn.net/zz_1215/article/details/7318800View Code #include<iostream>#include<vector>#include<algorithm>#include<string>#include<map>#include<set>using namespace std;map<int, set<int> > m;//x映射到一个y坐标的集合m 阅读全文
posted @ 2012-04-15 09:35 枕边梦 阅读(309) 评论(0) 推荐(0)
摘要:题意:给定一个矩形,将矩形切成给定任意个数的小矩形,当然每一个小矩形都有对应的权值,求最大权值分析:其实,就是一个类似完全背包的问题dp[i][j]表示从(0,0)到(i,j)对应的矩形可以切出小矩形的最大权值和View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 1000+10;struct rec{ int x,y; int p;}r[15];int dp[N][N];int main(){ int T,n,X,Y; 阅读全文
posted @ 2012-04-14 20:49 枕边梦 阅读(343) 评论(0) 推荐(0)
摘要:题意:求出1到N 的无向图的无重复边的最短路径数(即所有的最短路径没有公共边)分析:先求出最短路,再找出所有属于最短路的边(满足dist[u]+g[u][v]==dist[v]),把有向边(u,v)加入到新图中,容量为1,(即每条边只能用一次),最后求一次源点为1,汇点为t的最大流即可View Code #include<iostream>#include<algorithm>#include<string>#include<vector>#include<stack>using namespace std;const int N = 阅读全文
posted @ 2012-04-13 19:42 枕边梦 阅读(308) 评论(0) 推荐(0)
摘要:很明显的状态转移方程式:dp[i]=max(dp[j])+g[i], (0<=j<i && h[i]>h[j])不过注意到题目中n的范围有10000 ,n^2的算法…………我们可以用线段树优化一下先对高度离散化,作为线段树左右区间的端点这样,求dp[i]时,只需要查出高度(0,h[i]-1]范围内的最大值t,那么dp[i]=t+g[i], 之后,接着,更新线段树中高度为g[i],值为dp[i]的点View Code #include<iostream>#include<algorithm>#include<string>#i 阅读全文
posted @ 2012-04-13 16:30 枕边梦 阅读(411) 评论(0) 推荐(0)
摘要:题意:有n批人,m艘船,每艘船的容量为K, 让第i 批人上船可获利bi,但是会占据ai+1个船位,而且,整批人都在必须在同一艘船上,而且,优先级别高的那批人必须在优先级别低的人前面(包括船的所在编号,hint里面有提示)分析:参照大牛的思路,太牛逼了,dp[i]表示获得价值i需要最少的代价(占据的船位,同时保证同一批人在同一艘船上)就是一个类似01背包的过程了(同时也保证了优先级别),不过每一批人花费的代价要重新计算(根据前一个状态下剩余的船位)View Code #include<iostream>#include<algorithm>#include<stri 阅读全文
posted @ 2012-04-13 14:30 枕边梦 阅读(360) 评论(0) 推荐(0)
摘要:分析:当N为奇数时奇偶同性可互达,N为偶数时,逆序数之和sum加上空格所在行距目标空格行的距离dis之和要和终点状态逆序数同奇偶View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 300+10;int s[N*N],g[N*N];#define _cp(a,b) ((a)<=(b))int _tmp[N*N];int inv(int n,int* a){ int l=n>>1,r=n-l,i,j; i 阅读全文
posted @ 2012-04-13 09:45 枕边梦 阅读(544) 评论(0) 推荐(0)
摘要:二分距离,求最大团,看是否>=KView Code #include<iostream>#include<algorithm>#include<string>#include<math.h>using namespace std;const int N = 50+10;int dis[N][N],dd[N*N];int dp[N];bool inset[N],g[N][N];int n,best,ord[N],deg[N];bool found;inline void Memcpy(bool *d,bool *s){ for(int i=0 阅读全文
posted @ 2012-04-13 09:24 枕边梦 阅读(450) 评论(0) 推荐(0)
摘要:View Code #include <iostream>#include <string>#include <cmath>using namespace std;const int maxn = 105;int equ, var; // 有equ个方程,var个变元。增广阵行数为equ, 分别为0到equ - 1,列数为var + 1,分别为0到var.int a[maxn][maxn];int x[maxn]; // 解集.bool free_x[maxn]; // 判断是否是不确定的变元.int free_num;void Debug(void){ i 阅读全文
posted @ 2012-04-12 15:33 枕边梦 阅读(654) 评论(0) 推荐(0)
摘要:/*================================================================================================*\| Gauss消元算法求解开关灯问题\*================================================================================================*/开关问题:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与 此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态 阅读全文
posted @ 2012-04-12 15:31 枕边梦 阅读(911) 评论(0) 推荐(0)
摘要:前天做题遇到hdu2121 时一点思路都没有,于是往后面一道题去了,结果做了hdu2122(求最小生成树)之后受到启发,hdu2121分明就是一道求有向图的生成树,也就是最小树形图。。。。于是搜了很久,啃了很久,终于……主要在这下面三个博客上学习的:很赞的图,http://hi.baidu.com/bin183/blog/item/45c37950ece4475f1138c273.html很牛逼的理论http://www.zlinkin.com/?p=63很好的模板+题目http://www.notonlysuccess.com/index.php/mst/#more-315pku3164 C 阅读全文
posted @ 2012-04-11 09:01 枕边梦 阅读(3526) 评论(0) 推荐(0)
摘要:题意:数独游戏,不过只能用给定的多米诺骨牌填数独,而且每一个牌只能用一次,有唯一解分析:对一个未填的方格枚举三十六个牌,每一个牌有俩种摆放方式,……关键在于有没有好一点的判断方法,判断当前的放置方法是否符合数独的要求用三个数字st[3][9]表示st[0]数组表示九行的放置状态,比如,st[0][0]的每一个位表示第一行对应选了哪一个数字以此类推,st[1]表示列,st[2]表示3*3的方格代码有点冗长了,好挫…………View Code #include<iostream>#include<algorithm>#include<string>using na 阅读全文
posted @ 2012-04-10 15:26 枕边梦 阅读(223) 评论(0) 推荐(0)
摘要:给定N个物种的基因序列,若俩个序列s1和s2的最长公共子串长度len满足 |s1|*p<len && |s2|*p<len (p是题目给定的百分比),则俩个物种属于同一类,问这N个物种可以分为几类分析:额,LCS+并查集View Code #include<iostream>#include<algorithm>#include<string>#include<vector>using namespace std;const int N = 100+10;int n,f[N];double p;char str[N][ 阅读全文
posted @ 2012-04-09 19:18 枕边梦 阅读(220) 评论(0) 推荐(0)
摘要:最近又重新过了一遍二分匹配,发现了一些之前理解上的误区,这几天的纠结还是很值得的hdu1281 棋盘游戏//分别以行和列为单位,那么确定的和行和列唯一确定一个格子//行向列连边,求最多的可放置的格子,也就是求最大匹配//求重要点数,删除已匹配的边,判断是否存在最大匹配View Code #include<iostream>#include<algorithm>using namespace std;const int N = 101;int n,m,my[N],mx[N];bool vis[N],mat[N][N];//分别以行和列为单位,那么确定的和行和列唯一确定一个 阅读全文
posted @ 2012-04-02 10:32 枕边梦 阅读(198) 评论(0) 推荐(0)