pku ACM 解题报告
kyou007
本人热爱计算机。喜欢专研一些比较有难度的东西。。不太喜欢重复做同样一件简单的事情
毕业时间2012年6月 。
展开
-
poj 1321
<br />题意:貌似有中文题意,求组合的问题。<br />我的算法是搜索,写了我好久,果然我的搜索不给力呀。<br />额。。可以算是比较简单的搜索吧 我的只能算是过了 不能算是最优的。<br />#include <iostream>#include <string>using namespace std;int map[9][9];int putmap[9][9];//记录的是那些点已经被放下棋子int n,k;int sum;int right(int a[][9],in原创 2011-05-28 23:49:00 · 708 阅读 · 0 评论 -
poj 1519 Digital Roots
<br />题目要求:给你一个数字,然后将每位数都相加,如果结果不为各位数,继续加。<br />解题思路:把每位数都加了然后%9 如果结果为 0 输出9。<br />为什么要这么弄 我也不知道,只有记住了 太神秘了。<br />算法来源:discuss。<br />神秘代码:<br />#include <stdio.h>#include <string.h>int main(){ int i,sum,b,n; char a[2000]; while(scanf("%s",a),a[原创 2010-10-16 19:55:00 · 436 阅读 · 0 评论 -
poj 1089 Intervals
<br />题意:给了你一系列的区间,叫你求输入哪些区间是被给出的。<br />像这样的的区间 [5,6] [6,8]可以合并为一个区间[5,8];<br />解题思路:先对输入的区间进行排序,然后对区间进行合并。(具体实现看代码)<br />代码:<br />#include <iostream>using namespace std;#include <stdlib.h>typedef struct{ int x; int y;}weizhi;weizhi data[50原创 2010-10-16 15:32:00 · 991 阅读 · 0 评论 -
poj 1852 Ants
<br />题意:在一个管子里面有一些蚂蚁,他们按照初始的方向走,遇到蚂蚁后就掉头,问最少经过多长的时间,他们都已经走出了管子。<br />这道题目想到了会很简单没想到会很纠结。<br />提示:他们相遇的时候假设他们穿过了对方的身体。<br />代码:<br /> <br />#include <stdio.h>int main(){ int time,min,max,length,number,m,n,data; scanf("%d",&time); while(time --)原创 2010-10-17 15:30:00 · 1900 阅读 · 0 评论 -
poj 1850 Code
<br />题意:已经知道一串字符代表着一个数字,规律如下:<br />a - 1 <br />b - 2 <br />... <br />z - 26 <br />ab - 27 <br />... <br />az - 51 <br />bc - 52 <br />所以是不存在ba的情况的既按照ASCII码的大小来进行的,且没有大写字母。<br />问输入了一串字符,这个字符代表的是多少。<br />解题思路:从discuss上知道这道题目是一道组合数学的问题,只有一位的时候有26个,二位的时候有25+原创 2010-10-17 15:26:00 · 876 阅读 · 0 评论 -
poj 1828 Monkeys' Pride
<br />题意:这道题目是求猴王到底有多少个,猴王的定义是 以他为坐标的。。。没有点的x轴和y轴均大于他,那么这个猴子就被成为猴王,<br />显然猴王不只一个。开始我还一直以为猴王不是一个就是两个。<br />解题思路:排序后,下面的代码是按照x,y的升序排列的。进行一次扫描。<br />分类:水题目,貌似可以用dp,表示dp就不是水题了。<br />代码:<br />#include <iostream>using namespace std;#include <stdlib.h>type原创 2010-10-17 14:57:00 · 1061 阅读 · 0 评论 -
poj 1775 Sum of Factorials
<br />题意:判断一个数是否能够被表示为多个数阶乘的和。<br />例如:9 = 1!+2!+3!。但是并不要求阶乘是连续的。比如7 = 1!+3!7也满足条件。<br />思路:这道题目都可以用0,1背包来做,首先最多使用到10!,然后把1到10的阶乘的和都打表了。<br />但是这里从discuss里面得到了一个更好的算法,因为1!+2!+3!<4!,这情况的成立,<br />所以如果这个数能够表示成为多个数的阶乘,那么我们可以转换为这个数减去他能减掉的最大的阶乘的数是否能被表示。<br />详细的原创 2010-10-17 11:11:00 · 539 阅读 · 0 评论 -
poj 1745 Divisibility
<br />题目要求:给了你一些数字问你是否通过对这些数据进行加减法是够能够算出一个结果能为k整除。<br />输入:n,k<br /><br />接下来n个数。<br />解题思路:首先可以把输入的数据都转换成整数,并且可以把他们都转换成小于k的数。<br />算法思路:动态规划.<br />代码:<br />#include <iostream>using namespace std;int dp[10001][101]={0};//dp表示的为dp[i][j]前i个数是否能够组成余数为j,是则原创 2010-10-17 11:02:00 · 1487 阅读 · 0 评论 -
poj 1656 Counting Black
<br />题目要求:一道纯的模拟题目。<br />直接代码:<br />#include<iostream>#include<string>using namespace std;int main(){ int a[101][101]={0}; int t,i,j,x,y,l,count; string str; scanf("%d",&t); while(t--) { cin>>str; cin>>x>>y>>l; count=0; if原创 2010-10-16 21:49:00 · 551 阅读 · 0 评论 -
poj 1401 Factorial
<br />题意:求n的阶乘的结果后面有多少个0. 输入:第一排输入一个数代表要输入多少个数据。接下来: integer number N, 1 <= N <= 1000000000. 输出:阶乘0的个数。<br />算法思路:discuss来的 这个算法真的不错。求在这过程中有几个5.<br />因为10 = 2 * 5 因为2显然是比5多的在阶乘里面。、<br />代码:<br />#include <stdio.h>int main(){ int m,n; int cishu;原创 2010-10-16 19:39:00 · 310 阅读 · 0 评论 -
poj 1350 Cabric Number Problem
<br />题意:给你一个四位数 然后用这个四位数的每位数组成的最大值和最小值相减,最后的结果不是6174 就是0<br />输入:一个四位数,为-1的时候输入全部结束。<br />输出:每一个转换的过程,若这四位数的每位数都相当了输出:No!<br />sample input:<br />5364<br />2221<br />4444<br />-1<br />sample output:<br />N=5364:<br />6543-3456=3087<br />8730-378=8352<br /原创 2010-10-16 19:30:00 · 537 阅读 · 0 评论 -
poj 1274 The Perfect Stall
<br />题意:安排牛进牛棚。赤裸裸的二分图匹配。<br />注意:是多case<br />可以去多仔细看看匈牙利算法。<br />代码:<br />#include <iostream>using namespace std;int map[205][205],m,n,cy[205],f[205]; //f数组为标记的。cy保存匹配的情况int path(int t){ int i; for(i = 1; i <= m ; i++) { if(!f[i] && ma原创 2010-10-16 17:26:00 · 299 阅读 · 0 评论 -
poj 1251 Jungle Roads
<br />题目要求:求最小生成树。<br />注意建图。<br />ps:好好的看懂prim。建立好模板<br />算法:<br />假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树: <br /> 1:初始化:U={u 0},TE={?}。此步骤设立一个只有结点u 0的结点集U和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。 <br /> 2:在所有u∈U,v∈V-U原创 2010-10-16 17:15:00 · 425 阅读 · 0 评论 -
poj 1159 Palindrome
<br />题意:给了你一个字符串,问你需要经过修改几个字符能够使字符串变为回文字符串。<br />解题思路:将该字符串反转 寻找他与原字符串的最长公共子序列。<br />ps:总的来说 我感觉这道题目应该会有很高的算法的,然后我没有使用滚动数组,MLE了一次。<br />有时间的话 可以去用滚动数组尝试一下。<br />代码:<br />#include <iostream>using namespace std;//类似于最长公共子序列,该代码的解题思路是将字符反转后与原来的字符寻找最长公共子序原创 2010-10-16 16:28:00 · 415 阅读 · 0 评论 -
poj 1129 Channel Allocation
<br />题意:一些广播站,有些相连,有些不相连,相连的两个广播站不能使用相同的频率。<br />输入:<br />第一行代表有几个广播站。<br />接下来的哪些广播站是相连的。<br />输出:注意channel 和channels。<br />解题思路:首先这道题目是道比较简单的图题目,然后需要使用到四色定理<br />搜索的题目。<br />代码:<br />#include <iostream>using namespace std;int map[27][27];int n;i原创 2010-10-16 16:00:00 · 950 阅读 · 1 评论 -
poj 1126 Simply Syntax
<br />题意:这道题目是与语法规则有关的,首先这些语法规则满足下面的条件:<br />0.The only characters in the language are the characters p through z and N, C, D, E, and I. <br /><br />1.Every character from p through z is a correct sentence. //只有p到z的语法正确<br /><br />2.If s is a correct sente原创 2010-10-16 15:48:00 · 1275 阅读 · 0 评论 -
poj 1083 Moving Tables
<br />题意:大概思路就是叫你搬桌子,有一个走道和许多房间。<br />如题目所指示的房间那样。<br />然后他们要相互的搬桌子,若他们占用了相同的走廊的一部分,那么他们就不能<br />一起搬动。<br />题目输入了一些两个房间需要搬动桌子,问搬完所有的桌子需要多长的时间,每搬运一次桌子需要10分钟。<br />比如:<br />10 20<br />30 40<br />50 60<br />70 80<br />这些房间由于没有占用相同的走廊那么他们可以一起搬动只需要时间10分钟。<br />原创 2010-10-16 15:13:00 · 381 阅读 · 0 评论 -
poj 1528 Perfection
<br />题意:求比这个数的质数的和,然后判断与这个数的大小关系,这题目太水了。<br />我连优化都没有加的。<br />直接贴代码:<br />#include <stdio.h>int main(){ long d; long sum; long i; printf("PERFECTION OUTPUT/n"); while(scanf("%ld",&d),d) { sum=0; if(d==1) { printf("%5ld DEFICI原创 2010-10-16 20:09:00 · 617 阅读 · 0 评论 -
poj 1562 Oil Deposits
<br />题目要求:赤裸裸的搜索。<br />搜索方向:上下左右。<br />没优化的代码:<br />#include <iostream>using namespace std;int m,n;char map[101][101];void dfs(int a,int b){ int i,j; map[a][b] = '*'; for(i = -1 ; i < 2 ; i++) for(j = -1 ; j < 2 ; j++) { if(a+i >原创 2010-10-16 20:19:00 · 434 阅读 · 0 评论 -
poj 1001
<br />大数幂的题目,原来一直没有勇气写。最近终于过了 ,虽然代码很丑。<br />算法:模拟<br />#include <iostream>#include <string>using namespace std;string changeCharToString(char *p) //把char转换为string{ string str=""; size_t lenght=strlen(p); for(size_t i=0;i<lenght;i++) st原创 2011-05-28 23:44:00 · 703 阅读 · 0 评论 -
poj 3356 AGTC
<br />题意:给你了两个基因字符串,问最少经过多少次一下的操作可以使他们匹配:Deletion: a letter in x is missing in y at a corresponding position. //删除Insertion: a letter in y is missing in x at a corresponding position. //插入Change: letters at corresponding positions are distinct//改变<br />其中删原创 2010-10-18 09:48:00 · 1165 阅读 · 1 评论 -
poj 3624 Charm Bracelet
<br />题意:赤裸裸的0 1 背包。<br />思路来源:背包九讲的第一讲。<br />代码:<br />#include <iostream>using namespace std;int dp[401000];int w[3500];int d[3500];int n ,v;int max(int a,int b){ return a > b ? a : b;}void zeroonepace(int d,int w){ for(int i = v ;原创 2010-10-17 22:17:00 · 855 阅读 · 0 评论 -
poj 2533 Longest Ordered Subsequence
<br />题意:求最长的上升子序列的长度。 <br />解题思路:简单的dp。<br />dp[i]表示以i为结尾的最长上升序列。<br />代码:<br />#include <iostream> using namespace std; #define MAX 1002 int a[MAX]; int dp[MAX]; int main() { int n, max; int i , j; scanf("%d", &n);原创 2010-10-17 19:14:00 · 550 阅读 · 0 评论 -
poj 2504 Ubiquitous Religions
<br />题意:宗教信仰的引题,首先告诉我们相互认识的两个人有相同的信仰。<br />解题思路:比较简单的并查集入门。<br />代码:<br />#include <iostream>using namespace std;const int MAX = 50005;int father[MAX],num[MAX];int n,output;//father[i] 保存的是i的父亲节点。num【i】中保存的是 这个集合里面从i开始下面有多少个数+自己void init()原创 2010-10-17 18:21:00 · 842 阅读 · 0 评论 -
poj 2503 Babelfish
<br />题意:查询的题目,这道题目学习了bsearch()函数,二分查找。<br />代码:<br />#include<iostream>using namespace std;struct zidian{ char find[15]; char in[15];};zidian s[100020];int cmp(const void *a,const void *b)//字典数排序{ return strcmp( ((zidian *)a)->fi原创 2010-10-17 18:11:00 · 442 阅读 · 0 评论 -
poj 2387 Til the Cows Come Home
<br />题意:求两点之间的最短距离,而且还是赤裸裸的,用的算法dijkstra。<br />代码:<br />#include <stdio.h>#define MAX 2000000int map[1020][1020];int shortl[1020][1020];int dijkstra(int map[][1020],int n,int begin,int end);int main(){ int i , j , k; int t,n; int dist;原创 2010-10-17 18:01:00 · 453 阅读 · 0 评论 -
poj 2033 Alphacode
<br />题意:已知密码翻译的过程1-a ,2-b。。。。。26-z 给了你一串数字,问你给出的数字有多少种翻译组合。<br />例如:123 可以翻译为1 2 3 ,12 3 ,1 23总用有三种翻译方法。。<br />解题思路:类似于菲波拉芹(貌似不是这样写的),我用的是dp,注意对0的解决方案。思路看代码。<br />思路来源:discuss。<br />比如:110 只有一种方案翻译。<br />代码:<br />#include <iostream>using namespace std;原创 2010-10-17 17:43:00 · 690 阅读 · 0 评论 -
poj 1611 The Suspects
<br />题意:SARS隔离,如果是一群人里面有一个可疑,就都要隔离。<br /> and initially student 0 is recognized as a suspect in all the cases. //0就是首先被隔离的男人<br />貌似是赤裸裸的并查集。<br />代码:<br />#include <iostream>using namespace std;struct node{ int parent;//父亲结点 int count;//计数};原创 2010-10-16 21:45:00 · 326 阅读 · 0 评论 -
poj 1458 Common Subsequence
<br />题意:赤裸裸的求最长公共序列。<br />算法思路:dp。<br />dp[i][j]指前i和j有多长的相同的个数。<br />代码:<br />a#include <iostream>using namespace std;int dp[512][512];int main(){ char a[512],b[512]; int i,j; while(scanf("%s%s",&a,&b)!=EOF) { memset(dp,0,sizeof(dp原创 2010-10-16 19:50:00 · 309 阅读 · 0 评论 -
poj 1157 LITTLE SHOP OF FLOWERS
<br />题意:将某些花放入某些花瓶中得到的观赏价值是不同的,并且要求开始输入的数据必须在后输入的数据前面。<br />即:若一号花放入了3号花瓶,那么后面的花就不能放入1,2号花瓶了。<br />输入:<br />花的个数,花瓶的个数。<br />接下来是:是i花放入各个花瓶中的观赏价值。<br />解题思路:dp,dp[i][j]代表了在前j个花瓶中放了i朵花的最大观赏度。<br />转移方程为:dp[i][j] = max(dp[i][j-1],dp[i-1][j-1]+a[i][j]);<br /原创 2010-10-16 16:13:00 · 423 阅读 · 0 评论 -
poj 3125 Printer Queue
<br />题意:打印东西 首先打印的是数值最大的,问指定打印的之前打印了多少的。<br />代码:<br />#include <stdio.h>#include <stdlib.h>#define max 120struct type{ int num; int bools;};typedef struct { type base[max]; int front; int rear;}squeue;void intiqueue (squeue原创 2010-10-17 21:56:00 · 989 阅读 · 0 评论 -
poj 2386 Lake Counting
<br />题意:赤裸裸的搜索。<br />直接代码:<br /> #include <iostream>using namespace std;char a[101][101];int m,n;void dfs(int s1,int s2){ a[s1][s2]='.'; int i,j,x1,x2; for(i = -1 ; i<=1;i++) { for(j = -1 ;j<=1;j++) { x1=s1+i; x2=s2+j;原创 2010-10-17 17:54:00 · 514 阅读 · 0 评论 -
poj 1936 All in All
<br />题意:给了两个字符串,问一个字符串是否出现在另外一个字符串里面,出现的意思就是按照顺序 每隔 字符都按照顺序出现在另外一个字符串里面。<br />难度:水题。<br />代码:<br />#include <stdio.h>#include <string.h>char a[100002],b[100002];int main(){ int lb,i,j; while(scanf("%s%s",&a,&b)!=EOF) { i=0,j=0; lb=st原创 2010-10-17 15:43:00 · 581 阅读 · 0 评论 -
poj 1887 Testing the CATCHER
<br />题意:这道题目就是求最长的上升序列。<br />思路:dp,貌似是比较简单的dp。注意结果不一定是dp[n-1].<br />代码:<br />#include <iostream>using namespace std;int a[10000];int dp[10000];int main(){ int x; int cishu = 1; while(scanf("%d",&x), x!= -1) { int n = 0 ; a[n] =原创 2010-10-17 15:35:00 · 521 阅读 · 0 评论 -
poj 1664 放苹果(中文题目)
<br />题意:中文题意。<br />思路:来自大w还是discuss得。<br />用的是递归,哎。。。数学知识不好呀。<br />代码:<br />#include <iostream>using namespace std;int jie(int k,int r){ if(k<0) return 0; if(r==1||k==1) return 1; return jie(k-r,r)+jie(k,r-1);}int main(){ int k,r原创 2010-10-16 21:55:00 · 555 阅读 · 0 评论 -
poj 1068 Parencodings
<br />题意:已知有一串合法的括号匹配 ,他给出了所有的后括号前面有几个前括号,<br />叫你求后括号与他正确匹配的前括号之间有多少个后括号+1。<br />比如:<br />S (((()()())))<br /><br /> P-sequence 4 5 6666<br /><br /> W-sequence 1 1 1456<br />4 5 6666指的是在这个后括号前面有几个前括号。<br />1 1 1456指第一个后括号与他前面的一个前括号匹配。。依次的第二个,第三个。原创 2010-10-16 14:57:00 · 361 阅读 · 0 评论 -
poj 1035 Spell checker
<br />题意:首先输入一堆数据以 # 结束,然后输入一堆的查询数据 也 是以 # 结束。<br />然后按照 以下的规则:<br />?deleting of one letter from the word; //删除<br />?replacing of one letter in the word with an arbitrary letter; //代替 <br />?inserting of one arbitrary letter into the word. //插入<br />问查询原创 2010-10-16 11:07:00 · 416 阅读 · 0 评论 -
poj 1018 Communication System
<br />题意:在输入的公司里面,每个公司都要选择一条宽带线,但是能够使用的线的带宽是最“窄”的那根,<br />每根带宽线都有一个band和一个price;<br />题目的要求是输出带宽/总价值的最大比值。<br />例如:<br />题目中的列子:1 33 100 25 150 35 80 252 120 80 155 402 100 100 120 1100.649第一排的第一个数为测试的个数,第二个数为公司的总数(貌似换行写也没什么的)。接下来的为各个公司的情况,首先输入这个公司有几原创 2010-10-16 10:39:00 · 863 阅读 · 0 评论 -
pku 1032
<br />题意:将一个数分为互不相等也乘积最大的几个数。<br />算法思路来源:discuss讨论区。<br />思路: 我们首先先撇开“每组的人数不同”这一约束条件,我们发现如10可以拆成5+5,它的乘积最大,而5又可拆成2+3;2*3>5;故我们发现每次的每一个数都拆成两个相等或相差1的两个数乘积最大。而最大的当然是一直拆到出现2;<br /> 我们在回来考虑“每组的人数不同”这一约束条件;每组的人数不能相等,但我们又要使数拆成最小的部分(最好拆到出现2),比如说2.3.4~~,那我们大可从2加原创 2010-07-31 14:42:00 · 469 阅读 · 0 评论 -
pku 1028
<br />题意:模拟游览器的前进和后退。<br />注重点:对数据结构的基本掌握,用双向链表实现的<br />代码来源:大萎的代码直接交的。<br />代码:<br />#include <stdio.h><br />#include <string.h><br />typedef struct link<br />{<br /> char Address[70];<br /> struct link *prior;<br /> struct link *next;<br />}Link;<br />Li原创 2010-07-31 14:37:00 · 359 阅读 · 0 评论