01 2013 档案

摘要:POJ 2-sat 六题之四http://blog.sina.com.cn/s/blog_64675f540100k1g9.html题目描述:一堆夫妇去参加一对新人的婚礼。人们坐在一个很长很长的桌子的两侧(面对面)。新郎新娘在桌子头面对面座。新娘不希望看见她对面的一排有一对夫妇坐着(夫妇需要分开两排座)。同时,一些人之间有暧昧关系,新娘也不希望有暧昧关系的人同时坐在她对面的一排。问你可否满足新娘的要求,可以的话,输出一种方案。解题报告:首先,每个人都可能坐在桌子两侧的某一侧,这样,把每个人拆成两个点。第一个点表示桌子左侧(我自己定义的),第二个表示右侧。即i和i’新娘我让她坐在左侧,新郎坐在右 阅读全文
posted @ 2013-01-31 01:05 z.arbitrary 阅读(272) 评论(0) 推荐(0)
摘要:POJ 2-sat六题之三http://blog.sina.com.cn/s/blog_64675f540100k1cd.html题目描述:有n个婚礼,每个婚礼有起始时间si,结束时间ti,还有一个主持时间ti,ti必须安排在婚礼的开始或者结束,主持由祭祀来做,但是只有一个祭祀,所以各个婚礼的主持时间不能重复,问你有没有可能正常的安排主持时间,不能输出no,能的话要输出具体的答案:即每个婚礼的主持时间段是什么样的。解题报告:对于每个婚礼,主持时间只有两种状态,而且各个婚礼之间的主持时间之间有相互限制,所以想到2-sat。构图:对于婚礼i和婚礼j。i表示在开始主持,i2表示在结束主持,j类似。枚 阅读全文
posted @ 2013-01-30 23:41 z.arbitrary 阅读(248) 评论(0) 推荐(0)
摘要:POJ 2-sat 六题第二题http://blog.sina.com.cn/s/blog_64675f540100k15b.html题目描述:一些点,点的取值可以是0或者1,没有告诉你具体取值。一些边,有权值,有运算方式(并,或,异或),要求和这条边相连的两个点经过边上的运算后的结果是边的权值。问你有没有可能把每个点赋值满足所有边的要求。解题报告:每个点只有0,1两种值,并且和边对面的点有约束条件,所以可以转化为2-sat问题。令i表示点i去0,i + n表示点i取1.点i与点j and 等于0时。 i + n -> j, j + n -> iand 等于 1时,要求i和j必须为 阅读全文
posted @ 2013-01-29 23:42 z.arbitrary 阅读(306) 评论(0) 推荐(0)
摘要:题意:有一个n个点m条边的无向无环图,在尽量少的结点上放灯,使得所有边都被照亮,每栈灯将照亮以它为一个端点的所有边,在灯的总数最小的情况下,被两栈灯同时照亮的情况下边数最大解法:树形DP(边覆盖)d[i][0]=0,d[i][1]=1;d[i][0]=d[j][1];d[i][1]=min(d[i][0],d[i][1])cnt[i][0],cnt[i][1]表示节点i放灯和不放灯的情况下边被两栈灯照亮的数量。// File Name: 10859.cpp// Author: zlbing// Created Time: 2013/1/27 16:39:01#include<iostre 阅读全文
posted @ 2013-01-27 19:32 z.arbitrary 阅读(224) 评论(0) 推荐(0)
摘要:题意:两个人A,B玩游戏,轮流玩,A 先取,每个人每次只准在右边或左边拿1个或多个数,每个人都采取最优策略尽量让自己的得分高问A-B的最大值View Code // File Name: 10891.cpp// Author: zlbing// Created Time: 2013/1/23 17:46:22#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include&l 阅读全文
posted @ 2013-01-23 18:35 z.arbitrary 阅读(342) 评论(0) 推荐(0)
摘要:求最大公共子序列LCS,由于这题的数据比较大n=250*250,O(n*n)的方法不行。。又因为这题有一个特殊条件,每个序列的元素各不相同由于A,B序列元素各不相同,因此可以把A中的元素重新编号1~p+1,故B中的元素也相应的变化。结果答案变成求B的LIS。列如样例:A={1,7,5,4,8,3,9},B={1,4,3,5,6,2,8,9}.因此A的重新编号为A={1,2,3,4,5,6,7},B={1,4,6,3,0,0,5,7};故将LCS变成LIS,因为LIS可在O(NlogN)时间内解决,因此本题可以在O(NlogN)时间内解决。// File Name: 10635.cpp// Au 阅读全文
posted @ 2013-01-23 16:42 z.arbitrary 阅读(214) 评论(0) 推荐(0)
摘要:POJ 2-sat六题之一解题报告:http://blog.sina.com.cn/s/blog_64675f540100k13v.html题意:平面上,一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接。给你的信息中,每个点最多只会连接的一条边。问能不能连接这m条边,使这些边都不相交。这题主要是了解把边看成是2-sat的变量。边的里边和外边对应变量的true和false;解题报告:题意可能刚开始不是很好理解,比如1 5连边,2,6连边,由于点是顺序排列的,一画图就可以发现,这两条边必须一个从圆外面连,一个从内部连,否则就会相交。 阅读全文
posted @ 2013-01-22 22:24 z.arbitrary 阅读(302) 评论(0) 推荐(0)
摘要:照这书写的。。(┬_┬)这个题找bug找了半天原来是#define MAXN 2000+20不行。。怪我没看FQA。。哎。。然后改成#define MAXN 2020就行了这题是2-sat模型。。。虽然我也不知道为什么要这么做。但是好歹写了有个2-sat模版吧2-sat:有n个布尔变量xi,另有m个需要满足的条件,每个条件的形式都是“xi为真/假或者xj为真/假”。比如:“x1为真或者x2为假”。这里或者是指两个条件至少有一个是正确的,这样有三种组合满足。做法:我们将一个点拆成两个点,2i和2i+1,分别表示真或假对“xi为真或者xj为真”这样的条件,我们连一条有向边2i+1--->2j 阅读全文
posted @ 2013-01-22 14:48 z.arbitrary 阅读(376) 评论(0) 推荐(0)
摘要:约瑟夫环问题变形问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。编号0-(n-1)是有意义的,因为要模n,所以用0-(n-1)更好操作我们知道第一个人(编号一定是(m-1) mod n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m mod n的人开始):k k+1 k+2 ... n-2,n-1,0,1,2,... k-2并且从k开始报0。现在我们把他们的编号做一下转换:k --> 0k+1 --> 1k+2 --> 2......k-2 --> n-2变换后就完完全全成为了(n 阅读全文
posted @ 2013-01-19 23:58 z.arbitrary 阅读(324) 评论(0) 推荐(0)
摘要:有向图强连通分量题意:要求添加尽量少的边使得新图强连通。先求强连通分量,再进行缩点形成新图,然后求新图入度为0的个数和出度为0的个数的最大值即是答案;View Code #include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <stack>#define MAXN 20000+50using namespace std;int n,m;vector<int>G[MAXN];int lowlink[MAXN],sccno[ 阅读全文
posted @ 2013-01-16 18:19 z.arbitrary 阅读(196) 评论(0) 推荐(0)
摘要:边双连通分量这题的数据量比题目写的小,这题还需要判重,2个确定的点之间的任何边都算same path,唔,不知道为什么,很弱看不懂题目。。。。所以要先去重边,然后dfs求出桥,再dfs求出边双连通分量(只要不经过桥就行了)问加多少条边使得任意两点都有两条不同边的路,就是求一个双连通分量所以求出边双连通分量,然后缩点形成新图,新图上度数为1的节点(即叶节点)数目为ans(ans+1)/2 即为答案View Code #include <cstdio>#include <cstring>#include <iostream>#include <vector 阅读全文
posted @ 2013-01-15 23:54 z.arbitrary 阅读(279) 评论(0) 推荐(0)
摘要:刘汝佳新书题意:求无向图的点双连通分量,当一个点双连通分量只有一个割顶时才需要安装太平井且任选一个非割顶安装太平井即可。View Code #include <cstdio>#include <iostream>#include <vector>#include <stack>#include <cstring>#include <map>using namespace std;#define MAXN 60000int n;vector<int> G[MAXN],bcc[MAXN];int pre[MAXN] 阅读全文
posted @ 2013-01-13 14:49 z.arbitrary 阅读(544) 评论(2) 推荐(0)
摘要:刘汝佳新书题题意求是求不在任意一个简单奇圈的点的个数先求双连通分量,再用二分图判断是否是奇圈View Code #include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <stack>using namespace std;#define MAXN 1005int A[MAXN][MAXN];int n,m;struct Edge{ int u,v;};vector<int>G[MAXN],bcc[MAXN];int pr 阅读全文
posted @ 2013-01-10 00:08 z.arbitrary 阅读(314) 评论(0) 推荐(1)
摘要:这题的算法好神!Orzz一个周长为10000的圆圈,一开始等距的安放着N个雕塑,现在想增加M个雕塑,使得雕塑之间还是等距,问坟墓最少移动的距离?#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define F 10000using namespace std;int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ double ans=0; for(int i=1;i< 阅读全文
posted @ 2013-01-01 17:24 z.arbitrary 阅读(300) 评论(0) 推荐(0)
摘要:弱智商的碰到这种题就是跪啊!!!!题意:圆桌坐着N个人,每个人有一定的金币,金币总数能被N整除。每个人能给左右相邻的人一些金币,最终使得每个人的金币数目相等,求被转手金币数量的最小值。设 xi表示i号给i-1号xi金币,若xi为负,这表示i-1号给i号(-xi)个金币Ai表示i号一开始持有的金币则:对与第1个人:A1-X1+X2=M ===>X2=X1-(A1-M);令C1=A1-M 对于第2个人:A2-X2+X3=M ====>x3=x2-(A2-M) ====>x3=x1-(A1+A2-2M);===>x3=x1-C2; …… 对于第n个人:An-Xn+x1=M 这 阅读全文
posted @ 2013-01-01 15:50 z.arbitrary 阅读(265) 评论(0) 推荐(0)
摘要:题意:有N个部下,每个部下需要完成一项任务,第i个部下交待任务须花Bi分钟,然后他会立刻独立无间断地执行Ji分钟完成任务。求完成任务最短时间不能同时给多个部下交待任务,但部下可以同时执行他们各自的任务。贪心:按照执行任务时间从长到短一次执行。View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXN 1000+5int x[MAXN],y[MAXN];int n;struct 阅读全文
posted @ 2013-01-01 14:28 z.arbitrary 阅读(198) 评论(0) 推荐(0)