随笔分类 -  POJ

POJ的题目
摘要:题意:有n头,他们都有两个属性。第i头牛的属性为s[i]和e[i] (s[i] = e[j] && e[i]-s[i] != e[j]-s[j]。对每投牛求比它强壮的牛有多少头。 n 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include... 阅读全文
posted @ 2014-02-17 00:11 Plumrain 阅读(277) 评论(0) 推荐(0)
摘要:题意: 将含有连续的三个6的数称为不吉利数,比如666,1666,6662,但是6266吉利。则666为第一个不吉利数,输入整数n,求第n个不吉利数。(n 7 #include 8 #include 9 10 using namespace std; 11 12 #define CLR(x) memset(x, 0, sizeof(x)) 13 typedef long long int64; 14 int64 d1[20][10][10], d2[20][10][10]; 15 16 int64 get_num(int64 x) 17 { 18 int len ... 阅读全文
posted @ 2013-12-15 23:39 Plumrain 阅读(262) 评论(0) 推荐(0)
摘要:题意:给一个图,判断它的最小生成树唯一不唯一。解法:首先,容易想到一个O(n^3)或者说O(m*n^2)的方法。就是首先,求一遍最小生成树,记权值和为x1,然后枚举最小生成树中的每一条边,在不用该边的情况下求出的最小生成树权值和为x2,若枚举到某条边的时候x1 = x2,则最小生成树不唯一。若全不相等,则唯一。 但是,觉得这个方法太慢了,上网搜索了一下搜到了这篇文章,https://www.byvoid.com/blog/2-sp-mst,求次小生成树。(这道题相当于判定最小生成树和次小生成树权值和是否相等) 上面那篇文章的方法,中心思想在于:枚举每条不在最小生成树中的边,若将它加入最... 阅读全文
posted @ 2013-12-04 23:55 Plumrain 阅读(317) 评论(0) 推荐(0)
摘要:题意:有p个无限电波发射点,他们每个的有效范围都是d,即能与半径为d的圆内的其他无线电波点传递信息。同时,这些无线电波点之中可以选择s个点建立通讯卫星,建立了通讯卫星的之后的点都能传递信息。给出p,s和每个无线电波发射点的坐标,求d的最小值。解法:此处就是做一遍最小生成树,输出树的所有边中第s大的那个的值。具体证明过程见[小结论]使生成树的第k大的边最小的边的求法。tag:MST 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-12-02 23:36 4 * File Name: G-POJ-2349.cpp 5 */ ... 阅读全文
posted @ 2013-12-03 02:29 Plumrain 阅读(286) 评论(0) 推荐(0)
摘要:题意:有n个星球(编号0到n-1),有些星球之间有路径相连,且每个星球都有一个power值。每个星球可以求助,它会选择与它直接或间接相连的星球里power值最大的一个(如果有power最大且相等的几个星球,选择编号最小的一个星球),如果那个星球的power值比自己大,则向其求助,否则不能求助。现在,给出两种操作query a和destroy a b,前者的意思是问星球a会向哪个星球求助(不能求助输出-1),后者的意思是毁坏星球a和星球b之间直接连接的路径。(n 7 #include 8 #include 9 #include 10 11 using namespace std;... 阅读全文
posted @ 2013-11-29 00:36 Plumrain 阅读(416) 评论(0) 推荐(0)
摘要:题意:有一些人玩石头剪刀布,其中有一个人(称其为裁判)可以出“石头”,“剪刀”,“布”中的任意一个,其他人永远只能出相同的一个。即有的人只能出剪刀,有的人只能出石头,有的人只能出布。进行了多次对决,每次只告诉你谁赢了(或者平手),不说谁出了什么。问能否判断出谁是裁判,裁判有多少个?若只有一个裁判,问在进行了多少次对决以后就能判断出裁判是谁。解法:首先,判断出裁判的方法是,若1,2,3号选手的结果出现了矛盾,则1,2,3号中必有一个人是裁判, (1)这个时候如果3,4号的对决结果出现矛盾,则判定3为裁判,然后还需要验证(即如果3为裁判,其他对决结果是不是不会有矛盾); (2)这个时候如果... 阅读全文
posted @ 2013-11-29 00:21 Plumrain 阅读(400) 评论(0) 推荐(0)
摘要:题意:对一个只由1和0组成的字符串,给出指令,a b even/odd,表示字符串中第a位到第b位之间的1的个数为even/odd(偶数/奇数)。给出m个指令,a,b 7 #include 8 #include 9 #include 10 #include 11 12 using namespace std; 13 14 #define PB push_back 15 16 struct temp{ 17 int a, b; 18 bool x; 19 char s[10]; 20 }; 21 22 struct node{ 23 int... 阅读全文
posted @ 2013-11-28 01:06 Plumrain 阅读(579) 评论(0) 推荐(0)
摘要:题意:商场卖东西,每种商品有两个属性,一种是价格pi,另一种是保质期di,每种商品只能在天数 7 #include 8 #include 9 #include 10 11 using namespace std;12 13 typedef pair pii;14 15 int n, f[10005];16 pii a[10005];17 18 bool cmp(pii a, pii b)19 {20 return a.first > b.first;21 }22 23 int find(int x)24 {25 if (x != f[x]) f[x] = find(f[x]... 阅读全文
posted @ 2013-11-27 15:40 Plumrain 阅读(364) 评论(0) 推荐(0)
摘要:题意:罪犯有两个帮派,有两种命令,D a b,a,b表示罪犯的编号,这句话表示a和b来自不同的帮派。A a b,a,b表示罪犯的编号,这句话是问你a和b是否来自同一个帮派,可以有三种回答,“目前不确定“,”是“,”不是“。罪犯最多10^5个,命令最多10^5个。解法:并查集基础题。用一个struct node表示每一个罪犯,node.f表示该罪犯的父亲节点,node.r表示该罪犯与父亲节点对应的罪犯的关系(0表示来自同一个帮派,1表示不同)。然后写find函数注意更新node.r就行。具体见代码吧。Ps:另外,本题是POJ 1182的简化版,题解见POJ 1182 食物链。tag:并查集 1 阅读全文
posted @ 2013-11-26 09:47 Plumrain 阅读(677) 评论(0) 推荐(0)
摘要:题意:中文题,不翻译了。http://poj.org/problem?id=1182解法:并查集的基础题,好题。在之前我还做过POJ 1861,2524,1611三道水题,算是为了并查集入门。不过,现在做完1182才觉得,只要认真地把1182搞懂了,并查集这个知识点就真的完全搞懂了。 不过,这道题我觉得还是有一定难度的,可以考虑先做它的简化版,POJ 1703。题解见POJ 1703 Find them, Catch them(附题目翻译)。 本人智商有限,一直没有搞出来,看得别人的题解。(只看代码部分就能看懂,有大量注释)http://blog.csdn.net/spark_007/... 阅读全文
posted @ 2013-11-26 00:43 Plumrain 阅读(1045) 评论(0) 推荐(0)
摘要:题意:有n个点,部分点之间可以连接无向边,每条可以连接的边都有一个权值。求一种连接方法将这些点连接成一个连通图,且所有连接了的边中权值最大的边权值最小。解法:水题,直接用Kruskal算法做一遍就行了,不过还是应该仔细想想为什么Kruskal可行。原因是,在从小边往大边遍历的过程中(一直保持图为连通图),若判定某边i必须被连接,则因为图是连通图,所以连接比它小的边不可能使边i不需要连接,所以,要使边i不需要连接,必须连接比它大的边,根据题目要求,还是连接边i情况更优。tag:最小生成树 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-1... 阅读全文
posted @ 2013-11-24 22:34 Plumrain 阅读(299) 评论(0) 推荐(0)
摘要:题意:在w*h(最大100*100)的棋盘上,有的格子中放有一棵树,有的没有。问s*t的小矩形,最多能含有多少棵树。解法:最直接的想法,设d[x1][y1][x2][y2]表示选择以(x1, y1)为左下角,以(x2, y2)为右上角的矩形含有多少棵树。然后就可以很容易地递推了。可是空间复杂度为O(10^8)不能被接受。 又发现d[x1][y1][x2][y2] = d[1][1][x2][y2] - d[1][1][x1-1][y2] - d[1][1][x2][y1-1] + d[1][1][x1-1][y1-1],所以只需要预处理出所有的d[1][1][i][j]即可,然后每次求出一.. 阅读全文
posted @ 2013-11-18 15:41 Plumrain 阅读(264) 评论(0) 推荐(0)
摘要:题意:给定一个完全由小写字母组成的字符串s,对每个字母比如x(或a,b,c...z),在字符串中添加或者删除它分别需要花费c1['x']和c2['x']的代价,问将给定字符串变成回文串所需要的最少代价为多少。解法:设d[i][j]表示将字符串中从第i位至第j位变成回文串所需要的代价。若s[i] == s[j],d[i][j] = d[i+1][j-1];否则的话,有四种处理方法。 对xa.......by,可以将其变为xa......b,yxa.....by,a.......by,xa.....byx中的任意一种再处理。所以d[i][j] = min(d[i][ 阅读全文
posted @ 2013-11-18 15:32 Plumrain 阅读(232) 评论(0) 推荐(0)
摘要:题意:中文题,感觉没什么好翻译的。http://poj.org/problem?id=1191解法:将均方差公式变形,用ave表示平均值,均方差 = (∑xi*xi - 2 * ave *∑xi + n * ave * ave) / n = (∑xi*xi -n*ave*ave)/n。由于平均数一定,所以只需要使平方之和最小即可。 设s[x1][y1][x2][y2]表示以(x1, y1)为左上角,以(x2, y2)为右下角的矩形里,所有小格的数之和的平方。d[t][x1][y1][x2][y2]表示切t刀,以(x1, y1)为左上角,以(x2, y2)为右下角的矩形所能参生的最小平方和是.. 阅读全文
posted @ 2013-11-17 20:28 Plumrain 阅读(296) 评论(4) 推荐(0)
摘要:题意:一场ACM比赛有T支队伍参加,一共有m道题,给出每个队伍解出每一道题的可能性。求每只队伍至少解决一道题,且至少有一支队伍解决的问题数大于等于n的概率。(0 7 #include 8 #include 9 10 using namespace std;11 12 #define CLR(x) memset(x, 0, sizeof(x))13 14 double p[1005][100], d[1005][40][40];15 16 int main()17 {18 int m, t, n;19 while (scanf ("%d%d%d", &m, & 阅读全文
posted @ 2013-11-17 19:00 Plumrain 阅读(253) 评论(0) 推荐(0)
摘要:题意:给定n和s,一共有s个系统和n个bug种类,每个bug只可能属于某一种bug,也只属于某一个系统。但是由于每个系统都有无限多个bug,每种bug也有无限多个,所以每次发现的bug是哪一种bug的可能性一样,属于哪个系统的可能性也一样。问平均发现多少个bug以后,每个系统都有bug被发现了,每个种类的bug都有被发现。解法:概率DP的入门题。。。。。不会T T。 设d[i][j]表示发现了i个系统的bug,j个种类的bug,要到达目标状态还需要的天数的期望。 则d[i][j]可以转化为:1、d[i][j],转化为此情况的概率是i*j / (n*s);2、d[i+1][j],概率为(... 阅读全文
posted @ 2013-10-29 18:48 Plumrain 阅读(272) 评论(0) 推荐(0)