算法竞赛入门经典
Eureka_Yi
努力学习ing.
展开
-
Birthday Cake UVA10167
因为半径较小,A,B是整数,因此可以直接原创 2013-11-06 21:38:58 · 899 阅读 · 0 评论 -
XYZZY UVA10557
这道题用到了一个独特的算法SPFA,同时需要判断是否存在正环,刚开始的无从下手,后来参考别人的代码,就看明白了。#include#include#includeusing namespace std;#define maxn 110int grid[maxn][maxn],val[maxn][maxn],num[maxn][maxn];int vis[maxn],dis[原创 2013-11-05 21:29:53 · 871 阅读 · 0 评论 -
Bicoloring UVA 10004
有两种颜色,给一个无向图染色,要求相邻的点颜色不同。直接dfs。。这道题比较简单,但是我卡了很久。#include#includeusing namespace std;int grid[210][210];int color[210];int vis[210];int tag,n,m;void dfs(int pos){ int k; for(k=0原创 2013-11-01 22:13:48 · 622 阅读 · 0 评论 -
Dungeon Master UVA532
三维空间里面的BFS,知道了BFS的原理这道题很好解决。。原创 2013-10-29 20:28:24 · 620 阅读 · 0 评论 -
Maze Exploration UVA784
这道题就是题意不好理解,其实UVA的题目都好难理解。。。理解题意后都很简单。。简单的dfs。#include#includeusing namespace std;string grid[40];void dfs(int x,int y){ if(grid[x][y]=='X'||grid[x][y]=='#') return; grid[x][y]='#'原创 2013-10-27 21:37:05 · 685 阅读 · 0 评论 -
The die is cast UVA 657
还是DFS搜索,不过要用到两层DFS,仔细点就行,一个地方卡了非常久,怪自己太不仔细了。。#include#include#includeusing namespace std;char grid[60][60];int visit[60][60],visit1[60][60];int dist[1000];int w,h,k,s;void dfs1(int x,in原创 2013-10-27 16:48:10 · 748 阅读 · 0 评论 -
ID Codes UVA 146
这道题的一开始题意都没看懂,后来才发现就是求一个序列按照字典序的下一个排列组合。。。可以直接调用STL#include #include #include using namespace std;int main(){ string str; while(cin >> str) { if(str[0]=='#') break;原创 2013-11-09 16:41:22 · 919 阅读 · 0 评论 -
Generating Fast UVA10098
和上一道题差不多,调用STL#include#include#includeusing namespace std;bool cmp(char ch1,char ch2){ return ch1<ch2;}int main(){ int n; cin>>n; while(n--) { string str;原创 2013-11-10 10:48:48 · 1077 阅读 · 1 评论 -
The Hamming Distance Problem UVA729
给出两个数,一个是总位数,另一个是1的位数,求全排列#include#include#includeusing namespace std;int main(){ int n,k; cin>>n; for(k=1;k<=n;k++) { int r,t,i,j; cin>>r>>t; string原创 2013-11-10 14:38:04 · 964 阅读 · 0 评论 -
The Necklace UVA10054
又是一道无向图的欧拉图问题,首先判定是不是欧拉图,再输出,这里用到了一个算法:Fleury算法: (1)任取v0∈V(G),令P0=v0; (2)设Pi=v0e1v1e2...eivi已经行遍,按下面方法来从E(G)-{e1,e2,...,ei}中选 取ei+1: (a)ei+1与vi想关联; (b)除非无别的原创 2013-11-03 20:16:55 · 803 阅读 · 0 评论 -
Play on Words UVA10129
又是一道可以建模成欧拉图的问题,看题目第一感觉就是搜索或者递归,但是没有想到建模成欧拉图,对欧拉的图的判断还是太不清楚了,要多练练。#include#include#includeusing namespace std;int tag,m;int in[30],out[30];int grid[30][30],vis[30][30];void dfs(int k){原创 2013-11-03 10:22:20 · 760 阅读 · 0 评论 -
Ordering Tasks UVA10305
基本的拓扑排序,很简单。。但是我在边界条件卡了好久。。#include#includeusing namespace std;int grid[210][210];int c[210],topo[210];int n,m,t;bool dfs(int u){ c[u]=-1; for(int v=1;v<=n;v++) { if(原创 2013-10-30 21:16:05 · 713 阅读 · 0 评论 -
Morning Walk UVA 10596
这道题一看觉得是挺简单的欧拉图问题,一想总觉得不对劲,果然卡了很久,对欧拉图一点都不熟悉,代码还参考了别人的,在这里写一下欧拉图的判断有向图欧拉路或欧拉回路的判定方法:(1)有向图G为欧拉图(存在欧拉回路),当且仅当G的基图连通,且所有顶点的入度等于出度。(2)有向图G为半欧拉图(存在欧拉道路),当且仅当G的基图连通,且存在顶点u的入度比出度大1、v的入度比出度小1,其它所有顶点的入度原创 2013-11-02 14:59:44 · 885 阅读 · 0 评论 -
Slash Maze UVA705
这道题题意真是新颖,看到题目完全无从下手,想了很久都找不到思路,后来看了大神的想法,把斜杠放大成3*3格子,斜杠经过的是1没经过的是0,之后就比较好处理了,思路豁然开朗,但是之后判断是不是存在封闭图形的时候,有个注意的地方—在搜索一个点四周的时候,如果越界了那肯定不构成封闭图形。#include#include#includeusing namespace std;int gr原创 2013-10-31 11:09:27 · 806 阅读 · 0 评论 -
Knight Moves UVA439
这道题题目一看觉得很简单,但是看了样例数据之后发现不对劲,在网上搜了好久才发现国际象棋马的走法是这样走的,走日字。为此打印了几张国际象棋的棋盘格局,后来就理解了,简单的bfs,不过bfs对我来说还是有点生疏。#include#include#include#includeusing namespace std;int dist[10][10];int grid[10][原创 2013-10-29 15:51:25 · 662 阅读 · 0 评论 -
Oil Deposits UVA572
很简单的一道图的遍历,直接DFS就可以。#include#includeusing namespace std;char grid[120][120];int visit[120][120];int n,m,k; void dfs(int x,int y) { visit[x][y]=1; grid[x][y]='*'; if(y-1>=1原创 2013-10-27 13:57:47 · 696 阅读 · 0 评论 -
Undraw the Trees UVA10562
题目类型挺奇葩,看懂了题目就不难做,用递归遍历输出,但是要注意边界条件。#include#includeusing namespace std;string str[210];void dfs(int x,int len,int pos){ int t,pos1=pos,pos2=pos; if(x==len) { cout<<str原创 2013-10-26 14:10:00 · 696 阅读 · 0 评论 -
Not so Mobile UVA 839
这道题题意很好理解就是判断力矩平衡,一看题目就知道是要用递归dfs,但是陷进一个死胡同,在判断输入数字结束时纠结了很久,后面参考别人的代码发现完全不用考虑。哎·~太年轻。#includeusing namespace std;int ok;int dfs(){ int w1,d1,w2,d2; cin>>w1>>d1>>w2>>d2; if(w1==0原创 2013-10-27 10:10:18 · 684 阅读 · 0 评论 -
The Falling Leaves UVA699
这道题题意很好理解,在判定二叉树的节点数是不是结束的时候我用到了一个定理,二叉树也节点数也就是题中-1的个数等于度数为一和二的结点个数加一,题中不存在度数为一的结点,因此很好判断树的结点是否结束,然后用dfs深搜这棵树,不用建树。#include#includeusing namespace std;int arry[10000];int arry1[200];int pos原创 2013-10-23 21:45:45 · 678 阅读 · 0 评论 -
S-Trees UVA712
被题目吓到了。看了几次没看懂题意,后来发现题意很简单。。就是一颗满二叉树,给你一串01数据0是往左走,1是往右走,看最后掉在哪个叶子节点上。#include#include#includeusing namespace std;int arry[150],arry1[10],arry2[10];string ch[10];int main(){ int n,k=原创 2013-10-22 23:28:21 · 743 阅读 · 0 评论 -
Generalized Matrioshkas UVA 11111
题目大意:这题的题意比较难懂,看了好几变才明白。 就是有一个可以嵌套娃娃的娃娃,然后嵌套在里面的娃娃又可以继续嵌套娃娃。然后要求直接嵌套在里面(内一层)的娃娃的尺寸大小之和不能超过外面的。 例如,-3 -2 2 3,代表有两层,-3和3表示一个嵌套(这个娃娃的尺寸大小为3,且负数一定要在左边先出现),里面时-2和2表示一个大小2的娃娃。 再比如-5 -2 2 -1 1 5,表示有原创 2013-10-15 21:31:39 · 615 阅读 · 0 评论 -
Matrix Chain Multiplication UVA 442
这道题目被我想复杂了,不需要考虑括号的不对称问题,只需要考虑相乘时候两个矩阵合不合法。这个符号表达式我看的好难受。#include#include#include#include#includeusing namespace std;class T{public: int x,y;};class P{public: string s;原创 2013-10-15 09:41:16 · 737 阅读 · 0 评论 -
Team Queue UVA 540
题目大意:有个所谓的team排序, 给出t个队伍,以及这些队伍的成员。 然后进行排队。 ENQUEUE x: 把x插入队列中时。如果队列没有该元素的队员,则插入队列的最后面。如果队列中已经有了他的队员,那么插入最后一个队员之后。 DEQUEUE: 把队头的元素删除,并且输出STOP: 停止我在这道题上卡了近4天,一开始考虑的是用双端队列和栈来原创 2013-10-13 11:44:28 · 667 阅读 · 0 评论 -
Tree UVA548
这道题的做法很简单,就是根据二叉树的前序和后序序列建树,然后遍历这棵树。但是我经过无数次的wa,rte之后才AC的。首先建树就出现问题,之后遍历时用DFS方法也不正确。DFS还是不怎么会用。#include#include#include#include#include#define maxn 10005using namespace std;class Node{原创 2013-10-20 16:18:01 · 743 阅读 · 0 评论 -
Quadtrees UVA297
这道题不是很难,但是花费了挺长的一段时间的,思路很明确就是递归建树,然后递归遍历两棵树,求解。在写代码的过程中由于没搞清楚+和#include#includeusing namespace std;class node{public: char data; node *r1,*r2,*r3,*r4;};int sum,t;node* CreateTree(s原创 2013-10-22 16:07:51 · 749 阅读 · 0 评论 -
Hartals UVA10050
看懂题意就很简单了,感觉没用到什么数据结构。。直接用数组就可以过。#include#includeusing namespace std;int arry[100];int day[3700];int main(){ int n; cin>>n; while(n--) { memset(arry,0,sizeof(arry)原创 2013-10-09 16:02:49 · 641 阅读 · 0 评论 -
Parentheses Balance UVA 673
一道符号匹配的问题,这类题是栈的典型应用了,比较简单,只需要注意一下各种情况不然很容易wrong answer#include#include#includeusing namespace std;int main(){ int n; cin>>n; string str1; getline(cin,str1); while(n--)原创 2013-10-09 15:59:45 · 751 阅读 · 0 评论 -
The Dole Queue UVA133
这道题是一个双向约瑟夫环问题,原创 2013-10-07 21:32:10 · 705 阅读 · 0 评论 -
"Accordian" Patience UVa OJ 127 纸牌游戏
这道题对我这种小菜鸟来说简直就是难于上青天。。。。想了好久都没想出一个很好的算法出来,我还是太弱了。。加油!!!#include#include#includeusing namespace std;bool match(const string &x,const string &y){ if((x[0]==y[0])||((x[1]==y[1]))) retu原创 2013-10-05 21:31:32 · 1291 阅读 · 0 评论 -
Unix ls UVA400
这道题题意是给指定的单词排序并按照一定的格式输出,要注意的是,每行最多60个字符,最右边一列的按照最长单词的长度左对齐,其他的列按照最长长度+2左对齐,注意格式输出就行。。。#include#include#include#include#includeusing namespace std;bool cmp(string x,string y){ return原创 2013-10-05 14:22:09 · 938 阅读 · 0 评论 -
Stacks of Flapjacks 翻煎饼-UVA120 白书第五章
思路:先检查这些煎饼是否顺序排好,如果没有排好的话,找出当前位置下的最大的煎饼,翻转它使他翻到最上面,再从下面翻转一次,可以使他落到正确位置。。#include#include#include#includeusing namespace std;int cake[40];bool is_sort(int *arry,int len){ int i; f原创 2013-10-03 12:09:46 · 1396 阅读 · 2 评论 -
Ananagrams-UVA 156 白书第五章
思路:先把单词从字符串中提取出来存入vector中,然后复制一份把大写改为小写,并且对每个单词内字母排序,然后对比vector里面的单词看出现的次数,看是不是只出现一次还是出现多次。。。#include#include#include#include#includeusing namespace std;bool cmp1(char x,char y){ return原创 2013-10-03 12:05:17 · 1065 阅读 · 0 评论 -
Light, more light UVA10110
一道需要稍微思考的数学题目,题意大概是有n盏灯,一个人要走n趟,在第i趟会把灯的状态取反,求最后第n盏灯的状态。思路:假设第i趟i能被n整除的话,j=n/i,那么在第j趟又取反,状态不变化,而如果两个数相等的话就会发生变化,就是求这个数是不是平方数了。。#include#includeusing namespace std;int main(){ long long原创 2013-10-04 16:38:15 · 739 阅读 · 0 评论 -
Pseudo-Random Numbers UVA350
据说这道题要用到哈希(其实到现在我都不懂啥叫哈希。。。),先声明一个10000的数组,来记录出现一万以内出现的状态,和出现的次数,用第二次出现次数减去第一次就得到了一个循环次数。。#include#includeusing namespace std;int arry[10050];int main(){ int z,i,m,l,j=0; while(cin原创 2013-10-04 19:42:31 · 1890 阅读 · 0 评论 -
Factoring Large Numbers UVA10392
这么笨的方法也能AC。。。我以为一定会Time Limit Exceeded的。。哎,想不出来更好的方法了。#include#includeusing namespace std;int arry[1000005];bool isprime(long long x){ long long y=static_cast(sqrt(x)); if(x<=3) re原创 2013-10-04 19:28:00 · 948 阅读 · 0 评论 -
Just the Facts UVA568
这道题题意是求N的阶乘的最后一位非零位,我想的太过于简单了,一开始以为拿最后一位的非零位相乘就行了,哎,我还是太渣了。。。后来发现了几位大牛的代码一 这个比较好理解了#includeint main(){int n,s,i;while(scanf("%d",&n)==1){ for(i=1,s=1;i<=n;i++) { s*=i; while(s原创 2013-10-04 20:09:20 · 772 阅读 · 0 评论 -
ShellSort UVA10152
原以为这道题会比较难,要用到队列或者栈之类的数据结构,但是思考了一会发现完全不需要,直接模拟感觉更加简单。。#include#include#includeusing namespace std;int main(){ int n; cin>>n; while(n--) { vector str1; vector原创 2013-10-08 20:00:00 · 826 阅读 · 0 评论 -
The Blocks Problem (积木问题) UVa OJ 101
这道题我从下午一直做到晚上9点多,途中请教了一位同学,讨论2个小时之久,再经过自己1个多小时的测试数据,调试,终于找到错误,自己太不小心,在此一定要感谢乐于助人的hcbbt同学,思路很简单就是模拟,我是用vector模拟的。。#include#include#include#includeusing namespace std;vector bricks[30];int a原创 2013-10-06 21:55:28 · 1374 阅读 · 2 评论 -
The Mad Numerologist UVA-10785 第五章
一道简单的加权排序题目,在尽量使加权值最小的情况下,还要使整个字符串的字典序最小,我的思路是先把使字典序最小的元音字母和辅音字母求出来,再给它排序,麻烦了不少啊。代码如下:#include#includeusing namespace std;struct T{ char ch1; int value1,t1;}vowel[5];struct P{原创 2013-10-03 12:00:28 · 806 阅读 · 0 评论 -
Multiplying by Rotation UVA550
一道简单的数论题目,题意大概是给你一个基数,尾数,乘数,找出这样一个数字这个数字乘以乘数是的最低位变换到最高位,其他的位向右移动一位,好比这串数字循环移位,并要求这个数字位数最少。。。179487 * 4 = 717948(10进制)4*7=28 28!=7 28/10=2 28=8;4*8+2=34 34!=7 37/10=3 34=4;4*原创 2013-10-04 11:47:29 · 1057 阅读 · 2 评论