03 2012 档案
摘要:http://poj.org/problem?id=3264 是一道RMQ 算法的裸题,数据量很大,用 cin 估计会超的。提供一个百度里面的讲解RMQ 的链接,感觉讲的还是很易懂的http://qa4862741.blog.163.com/blog/static/56587549201162573625151/View Code #include<stdio.h>#include<cstdio>#include<cmath>#include<iostream>using namespace std;#define N 50001int mi[N
阅读全文
摘要:http://poj.org/problem?id=1001题目就是 大整数乘法的问题,只不过给的这个数是一个小数,但好在这是一个求幂的,即使有小数,只要把小数的位置标记一下,把原有的字符串转换为整数,等输出时在真确位置输出小数点即可本来想拿这道题目再练习一下乘法呢,真没想到自己这么的弱,不是忘了这就是忘了那,考虑的一点都不周全,脑子进水了View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 1000
阅读全文
摘要:http://poj.org/problem?id=2251题目就是给你一个三维的矩阵,让你从‘S’ 位置找到 ‘E’ 所走的步数,其实就是bfs类型的水题,只不过三维的可能感觉起来有点麻烦。 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<queue> 5 using namespace std; 6 #define inf 9999999 7 #define N 35 8 int move[6][3] = { {0,0,-1},{0,0,1},{
阅读全文
摘要:http://poj.org/problem?id=1321 题目没什么好说的,算是dfs里面的一道水题。 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 10 6 char str[N][N]; 7 int r[N],c[N]; // r 用来标记该行已经有旗子放了,c用来标记该列有棋子放上了 8 int sum,num; 9 int n,k;10 void dfs(int x)11 {12 int i,j;13
阅读全文
摘要:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2218好像也有点像模拟,当然这是看的解题报告。深刻感觉到string功能的强大,用起来真的很方便题目就是把给定的那个数转换成20进制的数来确定每一位的数字,因为从 0 ~ 100 就有20个不带e的 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 string digits[] = {"00", "02"
阅读全文
摘要:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2216算是模拟题吧,就是给你几个罗马数字表示的数,求他们的和然后再用罗马数字表示输出罗马数字表示的时候有些规则注意就是了。其实也是很简单的思路:先把 1~10,10~100,100~1000 这27个整数用罗马表示写到三个字符数组里,然后把给定的罗马数转换为我们的十进制数,相加后,再把这些数转换成罗马数输出就行了 1 #include<stdio.h> 2 #include<string.h> 3 #include<io
阅读全文
摘要:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2222不算一个难题,就是刚一开始读题的时候感觉,题目真的好绕啊。题目的意思就是给你 一串字符串,三个一组(空格也算一个字符)的分开,按照它给的标准把这些字符串变成六位数一组的串,如果某个字符串最后不足三个,那么就用空格填充。然后呢,题目的输入是任意给你四个数字,让你用刚刚得到的那几个六位数依次对这四个数取余,会得到四个余数,然后把这四个余数连接起来,会得到一个新的字符串,(记住,如果不是第一个余数,并且余数小于10那么就加前导零把它扩充为2位数)然后
阅读全文
摘要:http://poj.org/problem?id=3274感觉这都题目好无语,很早就开始看题目,可是看不懂就放下了,后来又看,还是没看懂又放下了。这样来来回回的以至于昨天做,还是看的discuss里面的才知道了怎么回事。这个就是给你n头牛和k个种类,然后会给你n个数字,这n个数字当你把他们转化为2进制数时,他们的数码个数不会超过给的种类个数,比如说样例给的种类 3 ,然后n个数里最大的那个是7,2进制数为111.然后让你找的就是连续的第i头和第j头中,满足这些牛的k种特征个数是一样的这个也许看了还是不大明白,看看下面的转化方式吧111 111 000110 22...
阅读全文
摘要:http://poj.org/problem?id=3349题目的意思就是给你一堆雪人的胳膊长,每个雪人都有六个胳膊,他们给出的顺序是按顺时针,或是逆时针给出的,但是六个里以哪个开头是不确定的。如果里面有任何两个相同,则就输出 “Twin snowflakes found.” 否则输出“No two snowflakes are alike.”。一开始我还以为是让找有多少个snowflakes,我想数据那么大,再怎么弄,也是TLE啊。原来是弄错题意了。悲剧。题意弄懂了,可是还是TLE,去看别人的解题报告,真厉害,这也能想到,而且代码一点不复杂,不过感觉还是很慢,3000多MS呢,呵呵,不过思路
阅读全文
摘要:http://poj.org/problem?id=3020题目就是一个最小路径覆盖的问题,因为这是一个无向图,所以,最小路径覆盖数 = "*"的总数 - 最大匹配数/2; 如果是一个有向图,则最小路径覆盖数 = "*" 的总数 - 最大匹配数。最大匹配用匈牙利算法就可以了,然后就是建图,因为题目中说了,可以上下左右的覆盖(只要是连着的),所以建图的时候,如果遇到一个 "*" 还要判断一下它的四周是不是也是 "*"; 1 #include<stdio.h> 2 #include<string.h&
阅读全文
摘要:利用快速排序,在进行完一次快排之后,让k和分成的两个子数组比较,比如说a[p……r] 被分成了 a[p……q]和 a[q+1……r] 让这个K和左边的子数组中元素的个数比较,如果大于,则递归左区间如果小于,则递归右区间。这样,在期望意义下,程序的时间复制度为O(n) 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 #define N 10000 6 int a[N]; 7 void sortt(int l,int r,int k) 8
阅读全文
摘要:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2376题目的意思就是给你一串字符串,其中,大写字母代表的是运算符,小写字母代表的是操作数,然后自定义一种运算形式为。给的这串字符用栈来进行运算,最后会得到一个新的序列,题目让你找的是一种序列,这种序列用同样的运算形式,经过队列的运算后得到的新序列与栈运算得到的序列相同。其实思路就是很简单,对给定的序列按二叉树的后序遍历形式建树,然后从左向右,从下到上进行层序遍历便可得到结果。建立二叉树不难,难的是当时做的时候没有想到层序遍历是可以bfs实现的,还是f
阅读全文
摘要:题目我感觉就是一个模拟题。就是给你说TinyBasic语言的语法规则,然后让你对这个TinyBasic语言程序就进行解释。只要认真一点,就能过掉了。要注意的就是,TinyBasic语言中表达式的定义有三个,后面只要是提到有表达式的地方,这三个定义都要考虑。一开始就是以为那个IF 那里只会有 判断式 ,忘了其他的两种情况了 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 #defi
阅读全文
摘要:http://poj.org/problem?id=2002用二维hash数组对输入的点进行标记。对原数组进行排序,然后从前到后任选俩个点,作为一个正方形的边,然后再根据关系求出另外两个点,在hash数组里看是否进行了标记,如果有,这找到了一个正方形。 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<stdlib.h> 5 #include<algorithm> 6 using namespace std; 7 #define N 201
阅读全文
摘要:http://poj.org/problem?id=1274这道题目与1469是一样的,我感觉连输出形式都差不多。只不过这里是牛与什么的匹配,同样,把他们分别用两个集合来保存,然后用匈牙利算法来求得最大匹配数 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 210 6 int map[N][N],m[N],v[N]; 7 int n,mm; 8 int dfs(int x) 9 {10 int i;11 for(i
阅读全文
摘要:http://poj.org/problem?id=3041这个题目真的一点变形都没有,直接套一个匈牙利算法求最大匹配数。把所给的点,分成两个集合,然后用一个模板就可以了 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 510 6 int map[N][N],v[N],m[N]; 7 int n,g; 8 bool dfs(int x) 9 {10 int i;11 for(i=1;i<=n;i++)12 {
阅读全文
摘要:http://poj.org/problem?id=1469题目是说有几门课程和几个学生,让你求的学生和课程之间的最大匹配数是否和所给的课程数目相等。如果相等输出“YES” 否则,输出“NO“下面这就是一个二分图 二分图模型二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。给定一个二分图
阅读全文
摘要:http://acm.sdut.edu.cn/web/showproblem.php?pid=2098&cid=1088意思就不用说了,都是汉语,都能看的懂。真是纠结了好几天,本来是A了的,可是后台数据一完善后,我的程序真是毛病百出了。重写这道题目!!!下面说一下判断字符串不合法的情况由于是好几天才A掉的,所以中间思路可能有些乱1. 从字符串第一个不是空格的地方开始,到字符串最后不为空格的地方。如果中间有空格出现,则是非法的2.如果字符串里没有“.”,也没有"e",也没有"E",则是非法的,如果有任何一个,则其个数不能超过1个,并且“e”和“E”
阅读全文
摘要:http://poj.org/problem?id=2488题目是说有一个骑士,在一个地图里以“日”字型走,看是否存在一条路径能使得他把每一个格子都走完,并且每个格子只走一次。如果存在这样的路径就按字典序输出这样的路径,如果不存在就输出impossible。其中地图中 列是用A—Z表示,行用数字表示提醒一下,深搜的时候一定要按字典序的形式进行搜索,否则输出的路线就不是字典序了。本来是一道很水的题,就是因为没有注意搜的方向,错了好几次 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1018这个题目好像还是在11年暑假看的呢,一直想用那个大整数乘法把N!求出,然后再用一个strlen函数求出位数,可是一直比较懒,都不愿意写,今天看书的时候,发现书上的讲解太牛了,虽然我不是很懂,还是拿来和大家分享一下吧。思路1. 这道题可以采用蛮力法,根据定义,直接求解。所谓N!位数,就是lg(N!)+1(不是很懂),根据数学公式: N ! = 1*2*3……N <==> lg(N!)=lg(2)+lg(3)+……+lg(n);所以呢 代码如下 1 #include<stdio.h>
阅读全文
摘要:http://poj.org/problem?id=2513题目的意思是说给一些木棒,每个木棒的头尾是不同的颜色,如果两个木棒首尾颜色相同就可以相接,问是否可以让所有的木棒都连起来。我是用的并查集和trie树和欧拉回路来判断的。建立trie树的过程中捎带合并集合,用并查集判断是否只有一个环,如果不是,则直接输出“Imb“然后再根据欧拉回路的条件判断,欧拉回路的条件:度为奇数的点的个数不能超过两个。 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace s
阅读全文
摘要:http://poj.org/problem?id=2418虽然给的训练题目是说trie树类的题目,我是按字符串处理来做的。题目的意思:先给出一下树木,然后统计这些树木的出现频率输出的时候是按字典序输出的,保留4位小数 1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<iostream> 5 using namespace std; 6 #define N 1000001 7 struct node 8 { 9 char str[40];10 }a[
阅读全文
摘要:http://poj.org/problem?id=3080 题目就是让找一个公共的最长子串(连续的)一看就想起了用KMP算法,但是本来就不太懂,更别说用了,还是搜了一下解题报告,套用了KMP的模板 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 200 6 char str[20][N]; 7 8 9 /*套用的KMP的模板,在模板串里求子串*/10 int kmp(char s[],char t[])11 {1
阅读全文
摘要:http://poj.org/problem?id=1035题目很简单,就是给一连串的字符串作为标准字符串,然后是输入以些变动的字符串,这个变动的字符串是这样定义的:1.可能是随意的删掉了一个字符2.可能是随意的加上了一个字符3.与标准字符串相比,随意的替换掉了一个字符。由于上面的定义都是说的一个,所以题目也就很简单了,只要罗列三种情况就可以,len1(母串)和len2(子串),1.len1==len2, 2. len1-len2==1 3. len2-len1==1;虽然这样说简单,但是我写的时候也不觉得简单,主要是我对处理字符串不会,老是少考虑情况。好像写的代码也很复杂 1 #inclu.
阅读全文
摘要:http://poj.org/problem?id=3278题目输入n和m,n代表人的位置,m代表牛的位置,牛是不动的,而人动的规则是可以前进一步,后退一步,也可以直接在现在的位置上乘2(乘2算是一步),问你进过多少步可以最快的把牛抓到。直接用bfs,调用库函数的队列就可以了 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<queue> 5 #define N 500000 6 using namespace std; 7 int move[2]={
阅读全文
摘要:就是一个递推的题目,但是由于数据比较大,所以用到了大整数。递推方程F(n)=F(n-1)+2*F(n-2); 1 #include<cstdio> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 10000 6 int b[N],c[N],t[N]; 7 int re[260][N]; 8 struct node 9 {10 int len;11 int re[N];12 }a[260];13 void ca()14 {15 int i,j;16 a[0
阅读全文
摘要:题目就是先给出一个母串,然后给出一个子串,看这个子串的所有字符是否在母串里按从前到后的顺序出现过 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 #define N 100000 7 char str[N],sbr[N]; 8 int main() 9 {10 int i,j;11 while(cin>>sbr>>str)12 {13 int len1=s
阅读全文
摘要:题目就是间接的让你翻译单词的,输入的每一行有两个单词,其中有一个可以认为是字典,另一个就是要翻译成的单词了可能是我想的复杂了,我是用trie树做的。先定义一个结构体,存储输入的字符串 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #define N 20 5 #define M 100001 6 using namespace std; 7 struct node 8 { 9 int k;10 node *key[26];11 node()12 {13 for(in...
阅读全文
摘要:就是简单的并查集应用,直接套模板都不带有改动的 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 #define N 30001 6 int a[N]; 7 int find(int x) 8 { 9 if(a[x]!=x) return a[x]=find(a[x]);10 return a[x];11 }12 int main()13 {14 int i,k;15 int n,m;16 while(cin>>n>&
阅读全文
摘要:http://poj.org/problem?id=2299题目就是让用归并排序求逆序数的。逆序数简单定义为:当i<j 时有Ai>Aj 则(Ai Aj) 就是一对逆序数 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 500001 6 __int64 sum; 7 int a[N],b[N]; 8 void merg(int l,int mid,int r) 9 {10 int i;11 int p=l
阅读全文
摘要:1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 #define N 100000 7 int a[N]; 8 int main() 9 {10 int i;11 int n;12 while(cin>>n)13 {14 memset(a,0,sizeof(a));15 for(i=0;i<n;i++)16 cin>>a[i];17 ...
阅读全文
摘要:这是一道并查集的简单题目,只要套用并查集的模板就可以了。题目的意思:输入一个n和m,接下来的m行,给出两个数x和y表示x和y有关系(你可以默认为他们信的一个宗教)。最后让你输出一共可以找到几个不同的宗教。 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 #define N 50010 6 int a[N]; 7 int find(int x) 8 { 9 if(a[x]!=x) return a[x]=find(a[x]);10 re
阅读全文
摘要:这道题目的意思就是给一个N 一个P 求一个K 使得他们满足这样的关系 K^N=P;我是直接用的数学函数pow来求的,可能是题目要求的不高,变量用double型的就直接过了 1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 int main() 5 { 6 double n,p; 7 while(cin>>n>>p) 8 { 9 double k;10 k=pow(p,1/n);11 cout<<k<<endl;12 }13 re...
阅读全文
摘要:贪心类题目 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdlib.h> 7 using namespace std; 8 #define N 10010 9 struct node10 {11 double x,y;12 }a[N];13 bool cmp(node a,node b)14 {15 return a.x<b.x;16
阅读全文

浙公网安备 33010602011771号