POJ
XD灬
路漫漫其修远兮,吾将上下而求索
展开
-
POJ1077——Eight
3 * 3的矩阵的八数码问题。比较简单因为输入的只是1-8,所以可以将x当作9.解决问题的关键是将数字序列根据康托展开转换成一个数,每一个数对应一个序列,所以可以用来判断这个序列是否查找过。用深搜搜索,总共9!种,还可以接受。下面是代码:#include #include using namespace std;const int SIZE = 362880;原创 2016-08-06 10:51:38 · 448 阅读 · 0 评论 -
北大ACM1503——Integer Inquiry
这题,很简单,高精度加法。写的比较冗长。还可以缩短代码。输入的时候,直接加起来,最后取余输出。下面的是AC的代码:#include #include #include using namespace std;char ans[200];char temp[150];void add(){ int length1 = strlen(ans); int length2原创 2015-08-03 13:15:47 · 655 阅读 · 0 评论 -
北大ACM3233——Matrix Power Series
题目的意思:计算矩阵S = A + A^2 + A^3 + ..... + A^k。A为n*n的矩阵。一个一个计算,然后相加,由于k最大为10^9,所以会超时。可以令S(k) = I + A + A^2 + ....+ A^(k-1).可以推出:S(k) = S(k - 1) + A^(k - 1)。进一步推出:矩阵 I 为(I的大小随n的变化而变化)下面的原创 2015-08-02 16:55:15 · 468 阅读 · 0 评论 -
北大ACM3734——Blocks
题目的意思是:N个方块排成一列,用四种颜色红蓝绿黄来染色。求染成红色的方块和染成绿色的方块的个数同时为偶数的染色方案的个数。设染色到第i个的时候,有三种情况:红绿色的偶数方案为a(i),红绿恰有一个是偶数的方案数为b(i),红绿都是奇数的方案数为c(i)。而在第i + 1 种情况,红绿的偶数方案为 a(i + 1) = 2 * a(i) + b(i)。2 * a(i) 代表第 i 个时恰原创 2015-08-02 14:25:35 · 618 阅读 · 0 评论 -
北大ACM3468——A Simple Problem with Integers~~线段树的应用
题目的意思很明确,有两种操作,一种是计算一个数列的第 a 到 第b的和,另一种是第 a 到 第 b 之间的数加上 c。由于这些操作的数目很大,用普通的办法无法办到,会超时。对于这类问题,用线段树可以很好解决。对于线段树还只是学习阶段,还不是很熟,需要多加练习与理解。#include #include #include using namespace std;typedef __i原创 2015-07-19 15:53:41 · 697 阅读 · 0 评论 -
北大ACM2686——Traveling by Stagecoach~~状态压缩DP
最近才看书,看到状态压缩。对于状态压缩,其实就是集合上的DP。这需要我们了解一些位运算:集合{0,1,2,3,....,n-1}的子集可以用下面的方法编码成整数像这样,一些集合运算就可以用如下的方法来操作:1.空集....................02.只含有第i个元素的集合{i}................1 3.含有全部n个元素的集合{0,1,2,3,..原创 2015-07-28 19:20:21 · 738 阅读 · 0 评论 -
北大ACM2503——Babelfish~~字典树的应用
题目的意思是:给你几个字符串对str1,str2。输入完毕后有一个空行,然后是询问的输入,每行一个字符串,如果该字符串与str2相同,则输出str1,否则输出“eh”。这题字符串对达到100000,询问的也达到了100000个,所以,普通的方法必定超时。所以需要建立字典树。这题还有一个比较麻烦的就是输入。如何控制那一个空行之后的询问输入,这是关键。简单的字典树的应用。下面是AC的代原创 2015-08-03 22:30:10 · 1030 阅读 · 0 评论 -
北大ACM3684——Physics Experiment
这题,题目的意思是,有N个球从高度为H的地方落下,每一秒落下一个球,球与球之间和球与地板直接都是弹性碰撞,求T秒后的每个球的位置,也就是高度。这题,跟Ants那题类似,也就是球与球碰撞可以当作不转换方向,继续按照原来的方向。也就是R = 0的时候,忽略半径,算出每一个球的位置,每一个球与地板碰撞后,会上升到原来的高度。先算出一次掉落需要t = sqrt(2 * H / g);每个球总共的时间T原创 2015-06-30 14:51:57 · 525 阅读 · 0 评论 -
北大ACM2104——K-th Number
题目的意思是:给你一个N个数的数组,有M条询问,每一次输入3个数,i, j ,k 意思是数组中从第 i 个到第 j 个中的数从小到大排序,第k个数是哪个?输出来。题目时间限制是20000MS,相对比较宽松,但是如果你用普通的方法来做,还是超时,没询问一次,你就要排一次序,消耗很多时间。我们可以想另外一种方法,也就是只用排一次序的。我们可以用这样的方法:每一个数,输入的时候,记录它原本的位原创 2015-07-25 10:01:51 · 586 阅读 · 0 评论 -
北大ACM2105——IP Address
这题,水题一个,题目的意思是将输入的32位二进制数,每八位转换成十进制,以IP地址的形式输出。下面的是AC的代码:#include #include using namespace std;int num[8] = {128, 64, 32, 16, 8, 4, 2, 1};int main(){// freopen("data.txt", "r", stdin); in原创 2015-07-25 10:14:01 · 607 阅读 · 0 评论 -
北大ACM1007——DNA Sorting
简单的题目,如题:找出字符串中的反转次数。按反转次数从小到大输出。反转次数,就是字符串中的每一个跟它后面的每一个字符比较,比后面的大的,次数+1.下面的是AC的代码:#include #include #include #include using namespace std;class data{public: char str[55]; int count;}原创 2015-06-14 10:28:19 · 1324 阅读 · 0 评论 -
北大ACM1088——滑雪~~DP
这题,简单的DP加上递归。题目的意思,从任意一个起点出发,找一条最长的路径。下面的是AC的代码:#include #include using namespace std;int num[102][102];int dp[102][102];int r, c;int xy[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};int ans;int原创 2015-08-05 21:57:16 · 840 阅读 · 0 评论 -
北大ACM1127——Jack Straws
题目的意思:给你N条木棍的两段的坐标,问 a 木棍与 b 木棍是否相连。间接的相连也算。判断点q 是否在线段p1p2上,只要利用外积是否有(p1 - q) * (p2 - q) = 0来判断是否在直线p1p2,再利用内积根据是否有(p1 - q) * (p2 - q) 要求两直线的交点,通过变量t 将直线p1p2上的点表示为p1 + t(p2 - p1),交点又在直线q1q2上,所原创 2015-09-09 23:03:26 · 458 阅读 · 0 评论 -
POJ1028——Web Navigation
简单的模拟题目,模拟浏览器访问网址的前进和后退。需要注意的是每次访问新的网址时,需要清空前进的栈的原创 2016-07-21 22:38:55 · 468 阅读 · 0 评论 -
POJ1068——Parencodings
模拟的题目。题目的意思是:一个包含括号的字符串,可以用两种方法来表示。P方法是:从左往右开始,每一个右括号,左边有多少个左括号,即写出该数,形成的数字序列即为P序列W方法是:从左往右开始,每一个右括号,往左边找第几个左括号来匹配,即写出该数,形成的数字序列即为W序列题目给你P序列,要求你求出W序列。模拟出括号字符串,再求出相应的W序列。代码:#inclu原创 2016-07-22 23:25:53 · 630 阅读 · 0 评论 -
POJ3187——Backward Digit Sums
题目的意思:给你N和sum。在1~N的排列中,找到最小字典序的排列,使得这N个数的排序按照题目的方法能最后组成sum这个数。简单的穷竭搜索。用next_permutation枚举。下面的是AC的代码:#include #include using namespace std;int num[11];int temp[15];int main(){ in原创 2016-06-05 11:45:13 · 349 阅读 · 0 评论 -
POJ2718——Smallest Difference
题目的意思是:给你一行数,多少个不知道,每一个数都是一位数(0到9),要求求出这些数组成的两个数之差最小。很容易想到的是贪心的策略,可以将生成的所有排列平均分成两部分,求这两部分组成的数的差,不断更新最小差的值。需要注意的是0不能作为数字的开头,也就是n个数中,这样的排列是不行的,也就是0和n/2这两个位置为0.这样存在一种特殊的情况,就是两个数的时候,其中一个为0,这样所有的排列都不原创 2016-06-05 10:26:13 · 420 阅读 · 0 评论 -
Uva1151——Buy or Build && POJ2784——Buy or Build
最小生成树的应用。输入n个城市(1~n),和q个方案,接下来q行的第一个数为该方案中的城市数a,第二个数为用该方案需要的钱b,接下来a个数为城市的编号。接下来n行为第n个城市所在的坐标位置。在这些城市之间建设道路,使得两两城市直接连通。在两个城市之间建设道路,需要花费 两个城市之间的坐标的欧几里德距离,若买方案,则方案内的城市已经连通。先进行一次求最小生成树,再枚举方案再求最小生成原创 2016-03-12 16:29:03 · 828 阅读 · 0 评论 -
北大ACM2348——Euclid's Game
题目的意思:给两个数a 和 b ,每一次只能从较大数中减掉较小数的倍数,先减到0 的获胜。可以分成两种可能:b - a a第一种情况:b 只能减去a,而b - a之后是必胜态,则它是必败态,反之就是必胜态。而第二种情况总是必胜态。下面的是AC的代码:#include using namespace std;int a, b;void solve(){ bo原创 2015-09-16 23:09:58 · 347 阅读 · 0 评论 -
北大ACM2484——A Funny Game
题目的意思是:n 个硬币围成一圈,每次只能拿连续的两个或者一个硬币,最后拿完的那个人胜利。相隔空位的硬币视为不连续。这个问题,其实是一个必败的事件。n 个硬币围成一圈,第一个人从中取两个或者一个,另外的一个人可以通过在第一个人的去的位置的对面取两个或者一个硬币使得剩下的硬币成为两条等长的链,而无论第一个人再次如何取,另外一个人都可以让剩下的硬币成为两条等长的链。而第一个人必败。第一个人原创 2015-09-16 22:46:50 · 363 阅读 · 0 评论 -
北大ACM1067——取石子游戏
杭电1527的代码通不过。AC的代码:#include #include #include using namespace std;int main(){ int a, b; double k = (sqrt(5.0) + 1.0) / 2.0; while(cin >> a >> b) { if(a > b) swap(a, b); int j = b原创 2015-09-17 16:38:26 · 490 阅读 · 0 评论 -
北大ACM3041——Asteroids~~最小顶点覆盖问题
题目的意思是:在N * N 的网格中,有K 个小行星,一个强大的武器,可以一次消灭一行或者一列的行星,求最少的发射武器的次数将所有行星消灭。这个就是最小顶点覆盖问题。求解最小顶点覆盖问题很难,然而最大匹配数等于最小顶点覆盖。所以问题转换成最大匹配的求解。AC代码:#include #include using namespace std;//输入int N, K;in原创 2015-09-12 22:33:17 · 836 阅读 · 0 评论 -
北大ACM2187——Beauty Contest
题目的意思是给你N个点,求各对点之间的距离的最大值的平方。由于N很大,暴力的方法不行,所以就要去点一些没有必要计算的点,也就是求凸包。凸包的求解方法,就是将所有点排序之后,第一个和最后一个必定是凸包上的点,剩下的就是从上和从下两个方向继续求解凸包上的点。不懂的可以看这个:http://www.cnblogs.com/jbelial/archive/2011/08/05/2128625.原创 2015-09-12 21:56:25 · 372 阅读 · 0 评论 -
北大ACM2739——Sum of Consecutive Prime Numbers
题目的意思是:给你一个数N,求由连续的m个素数之和等于N的组数。这题很简单,一开始没看到题目是连续的素数,所以一开始想用深搜来做,可是不行,后来再看了题目,才知道是连续的素数,是连续的素数就简单很多了。下面的是 AC的代码:#include using namespace std;int prime[10005];int main(){ int i, j, k; for原创 2015-07-08 13:31:23 · 948 阅读 · 0 评论 -
北大ACM2785——4 Values whose Sum is 0~~双向搜索
题目的意思很明确,ABCD四个集合,从各个集合中抽取一个数,求将四个数相加等于0的组合数。由于N最大达到4000,所以,暴力的方法过不了,就是时间限制为15000MS也是不行。不过我们可以双向搜索,也就是折半搜索。先求出CD这两个集合的两两配对的新的集合CD,然后在从CD集合中找AB集合两两配对的和k的负数有多少个。用upper_bound和lower_bound函数可以很快的求解出来原创 2015-06-30 15:56:55 · 741 阅读 · 0 评论 -
北大ACM1258——Agri-Net~~最小生成树
比较简单的题目.直接附AC的代码:#include #include #include using namespace std;class data{public: int form, to, height;};data Edge[10005];int N, num, par[105];int cmp(const data& a, const data& b)原创 2015-05-06 12:02:58 · 577 阅读 · 0 评论 -
北大ACM2229——Sunsets~~简单DP
题目的意思是输入N,有多少种由2的整数幂相加的情况。下面的是AC 的代码:#include #include using namespace std;int dp[1000002];int a[21];const int mod = 1000000000;int main(){ int i; memset(dp, 0, sizeof(dp)); dp[0] = 0;原创 2015-05-13 21:22:58 · 692 阅读 · 0 评论 -
北大ACM3259——Wormholes
题目大概的意思是:输入的N,M,W。N代表有多少块田,M代表有多少条路(双向的),W代表有多少个虫洞(单向的)。然后下面的M行,表示田i与田j之间的路需要走多少秒,再下面W行,就是田i与田j之间的虫洞能返回多少秒(也就是穿越到之前的时间)。求解是否存在一条路径使一个人回到起始田时,那人可以看到之前的自己。解题的思路,用bellman_fory算法找出图中的负权环。判断图中是否有负圈原创 2015-05-05 21:10:35 · 639 阅读 · 0 评论 -
北大ACM2139——Six Degrees of Cowvin Bacon
题目的意思是:输入牛的头数和电影的个数N和M,接下来M + 1 行为每一部电影涉及到的牛的个数已经哪一头牛。在同一部电影里面的牛与其他的牛(也在这部电影中)的度为1.求解的是每一头牛到其他的牛的度之和最小。(题目的是求平均的,将度之和除以N - 1 再乘以100就行了)典型的最短路径问题,只是这里求解的是任意两头牛直接的,用Floyd算法可以搞定,N最大为300,时间复杂度为N^3,完全可原创 2015-05-05 19:45:22 · 536 阅读 · 0 评论 -
北大ACM3176——Cow Bowling~~数塔
这一题,简单的动态规划。状态转移方程:dp[i][j] + = max(dp[i + 1][j], dp[i + 1][j + 1]);(i = n - 2 to 0; j = 0 to i); 最后输出dp【0】【0】就OK了。下面是AC的代码:#include #include using namespace std;int max(int x, int y){原创 2015-05-05 12:57:13 · 627 阅读 · 0 评论 -
北大ACM3641——Pseudoprime numbers~~快速求幂法
这一题,主要是快速求幂的方法的应用。可以看看快速求幂方法的原理:http://blog.csdn.net/qq_25425023/article/details/44316463题目的大概意思是:输入两个数p,a,p为素数,则直接输出no,否则判断a^p % p == a?等于就yes,不等于就no。理解了题目的意思,就很容易了。下面的是AC代码:#include原创 2015-05-04 22:30:53 · 614 阅读 · 0 评论 -
北大ACM3061——Subsequence
题目大概的意思是:给你一个整数数列,从中找出最小连续子序列的和不小于整数S。数列最小为10,最大为100000,用暴力法估计会超时,我没有试过。这里,我将用两种方法来求解这一题,一个时间复杂度为nlogn,另一个时间复杂度为n,不过两个提交了,时间都是79MS。没多大的区别。1.时间复杂度为nlogn的方法:主要的思路是用一个数组 sum 算出数列的前 i+1 个数的和,(i从0到原创 2015-05-04 20:41:55 · 517 阅读 · 0 评论 -
北大ACM3320——Jessica's Reading Problem
这一题,是简单的取尺法的应用。题目大概的意思是:一个人复习一本书,这本书的每一页都有一个知识点ai,每一页的知识点可能会与其他页的知识点相同,问你如何读最少页,将所以知识点读完。使用STL中的 set 来判断里面有多少个不同的知识点num, 用STL中的 map 表示知识点与出现次数的映射。同样的设置知识点数sum,页数的起点和终点s和t。首先将知识点的数组a 加入map中,直到sum原创 2015-05-04 21:40:27 · 789 阅读 · 2 评论 -
北大ACM1064——Cable master
题目主要的意思是:有N条绳子,它们的长度分别为Li,如果从它们中切出K条长度相同的绳子的话,这K条绳子每一条的最长的长度能是多少?这一题用二分搜索可以很好的进行求解。长度分别为0到INF(INF为尽可能大的数)。然后进行二分搜索,不断的缩小范围,循环一定的次数,可以很好的将答案求出。G++double要用%lf输入,用%f输出,C++是window下的,用%lf输入,用%lf输出。原创 2015-04-30 21:34:56 · 861 阅读 · 0 评论 -
北大ACM2456——Aggressive cows~~二分搜索
这一题,也是简单的二分搜索,求解放置的牛之间的距离尽可能远,也就是最大化最小值。主要的一步就是将第i头牛放在了x[j]的位置中,第i + 1头牛就要放在满足x[j] + d ,k的最小值。下面是AC的代码:#include #include using namespace std;int N, M;int X[100005];bool C(int x){ int原创 2015-04-30 22:03:45 · 816 阅读 · 0 评论 -
北大ACM1742——Coins~~多重背包
题目的意思是,输入n个硬币的面值和数量,求不超过m的组合方法的数目。今天学习了多重背包,但是还是不是很懂,继续努力。下面的是AC的代码:#include #include #include #include using namespace std;class data{public: int value, count;};data Da[101];int d原创 2015-05-13 23:13:16 · 687 阅读 · 0 评论 -
北大ACM1703——Find them, Catch them~~并查集
题目的意思是:在一个城市,有两个犯罪团伙。输入N(人的个数)和M(信息的个数)。后面M条信息是一个字母加上两个数字i和j,如果字母为D,则说明i和j属于不同的犯罪团伙,如果字母是A,则要你判断i和j的关系,属于同一个还是属于不同的还是不确定。一开始,觉得这个题目计较棘手,属于D的情况下,是属于不同的犯罪团伙,不知道如何来解决。后来想到了之前看到的一题,POJ1182食物链,判断有多少条信息原创 2015-05-06 21:18:09 · 676 阅读 · 1 评论 -
北大ACM3624——Charm Bracelet
这题,简单的01背包问题。下面的是AC的代码:#include #include using namespace std;int dp[13500];int n, m;class data{public: int w, d;};data Data[3500];int max(int x, int y){ return x > y ? x : y;}int原创 2015-06-30 15:24:03 · 786 阅读 · 0 评论 -
北大ACM1328——Radar Installation~~贪心
题目的大概意思是:给你N个坐标,雷达的半径为d,求至少安装多少个雷达才能将所有点覆盖。雷达都在 x 轴上,不能全部覆盖的就输出 -1.思路大概是,先算出雷达覆盖每一个点的横坐标的范围。然后再来贪心求解有几个。下面的是AC的代码:#include #include #include using namespace std;class data{public: double原创 2015-05-27 15:32:24 · 2236 阅读 · 0 评论 -
北大ACM1006——Biorhythms~~中国剩余定理
中国剩余定理,百度一下,就有它的定义与证明。这里我就讲一个例子就好了。题目的意思就是给你p,e,i,d。(n + d)% 23 = p,(n + d) % 28 = e,(n + d) % 33 = i。求最小n。将n+d看成一个整体,m =n + d。要求m:先使 28 * 33 * a % 23 = 1,求出a,x = 28 * 33 * a;使 23 * 33 * b原创 2015-06-14 09:39:44 · 1296 阅读 · 0 评论