
uva解题报告
文章平均质量分 59
monkeyduck
清华大学CS在读,研究领域为语音处理、模式识别、对话管理,依然在不断学习中,成功在于点滴积累!
展开
-
uva10487
#include#includeusing namespace std;int n,m,k,cases,sum,arr[1005],S[1000000];void calsum(){ k=0; for (int i=0;i<n-1;i++){ for (int j=i+1;j<n;j++){ S[k++]=arr[i]+arr[j]; } } sort(S,S原创 2014-06-25 13:55:34 · 1241 阅读 · 0 评论 -
【uva10057】巧妙做法
这个题之前做过,方法太笨还不对,今天再做突然想到一个巧妙做法,网上应该也有别人用此方法的,因为并不是很难,但我没有看别人的,是自己想出来的哈哈哈首先要对输入的数组进行排序,这是毋庸置疑的。因为要计算绝对值的和,所以就想到了数轴上的距离的概念。要使|X1-A|+|X2-A|最小,也就是要找一个点A,使其到X1,X2距离和最短,所以很容易想到在数轴上只要A在X1和X2之间就行。原创 2014-06-06 10:39:40 · 1304 阅读 · 0 评论 -
【uva10341】二分法解方程,注意单调性
p*e-x+ q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 x .好久没碰高数,差点连求导都换给老师了,还好哥数学基础比较扎实,求这个程度的导数还是轻轻松松的。求个一次导数发现恒小于0,说明其在【0,1】上是单调递减的。提前判断f(0)是否0,如有上述两种情况直接输出无解。原原创 2014-06-05 15:00:36 · 1528 阅读 · 0 评论 -
uva705一次AC
这题读完想了一会,没有什么思路,不知道如何处理‘\’和‘/’,因为它们是“墙”,但是这墙是具有方向性的;而且没有路,输入全部由“墙”组成,与以往做过的图找路径的题目有很大的不同,一时没有办法。后来看了网上的思路,觉得非常好。做法就是把原图放大2倍或3倍。放大2倍是指用2*2的0-1矩阵表示‘\’或‘/’具体为‘\’表示成1 0 '/'表示成 0 1原创 2014-01-20 15:04:44 · 1169 阅读 · 0 评论 -
刘汝佳《算法竞赛入门》推荐题目整理
题号全部为uva题号另附两个参考网站:1.uva崩的时候用下面这个可以代替http://acm.hust.edu.cn/vjudge/problem/toListProblem.action2.没有输入的正确答案可以用下面这个生成http://uvatoolkit.com/problemssolve.php一、基础题目1. 字符串a原创 2014-01-17 16:44:48 · 3008 阅读 · 0 评论 -
uva270 已成功AC!
挺简单一题,编完后过不了,然后一直调,是在不知道哪里有问题,看了网上别人的代码,思路一样的,实现稍微有点不同,然后就开始改,照着别人的改,可是一直过不了,最后改得几乎是一样的了,可还是wa,我就不明白为什么了,到底哪里出错了??我的代码#include#include#includeusing namespace std;struct Node{ float x,y;};原创 2013-11-17 11:33:20 · 1506 阅读 · 0 评论 -
uva10132 字符串数组的qsort排序技巧
首先声明uva服务器又崩了,没有提交所以不知道这道题能否AC,思路可以参考一下,不难。因为文件都相同,且恰好分成两部分,所以我先将所有字符串按长度排序,最短串和最长串组成的一定是源文件!如果有多个最短串和最长串,就要排列组合去试了。在编写qsort的比较函数时遇到了问题,百度后解决了,最主要就是*(char**)这里,容易写错,如果只写char*,那是指向字符的指针,char**才是指向指原创 2013-11-16 15:48:29 · 1444 阅读 · 0 评论 -
uva10763 简单做法
转载请注明出处,谢谢!原文地址:http://blog.youkuaiyun.com/monkeyduck题意开始有点歧义,我以为只要方案可行即输出YES,就是在1 2,2 3,3 1这种方案的情况下应该是可以的。但是跑到网上去试验发现这种方法不行,因为题目要求就是两个学生互换,A.X==B.Y&&B.X==A.Y才可以配对成功。所以想到用结构体,然后用链表存储,配对一对后即删除节点,原创 2013-11-15 09:24:58 · 1197 阅读 · 0 评论 -
uva10905同一思路的两种做法,前一种WA,后一种AC
这道题应该算一道普通的排序吧,实际上就是另一种形式地比大小,自己最开始是用int型存,后来觉着不行,改用long,结果还是WA,这是第一个程序。第二个程序是改用string处理,确实比int方便很多,在运算符重载那里体现就非常明显。这个题目用到了之前总结过的结构体加入优先级队列需要重载运算符,之所以写成结构体是因为我不知道直接将string加入优先级队列时怎么写比较函数。。。⊙﹏⊙b通原创 2013-11-14 19:29:43 · 1091 阅读 · 0 评论 -
uva 10282 初学哈希入门题
转载请注明出处,谢谢!http://blog.youkuaiyun.com/monkeyduck题目比较简单,哈希函数也不需要怎么设计,不追求完全没有冲突的话就随便算就可以了,然后加入哈希表和查找表的时候对应好。比较关键的一个地方是word和dic数组的下标不要从0开始哦!#include#includeusing namespace std;const int MAX=10000原创 2013-11-14 13:43:01 · 1534 阅读 · 0 评论 -
uva188 完美哈希题解
找一个最小的整数C使得不冲突,C必须是某个数的倍数且尽可能小,当C不满足题设条件则进行计算去找下一个C一次ac,比较简单的模拟题,其实和哈希没啥太大关系。注意审题,单词和单词的间隔可以不只一个空格。转载请注明出处,谢谢!http://blog.youkuaiyun.com/monkeyduck#include#include#includeusing namespace st原创 2013-11-11 14:16:17 · 1577 阅读 · 0 评论 -
uva321 bfs搜索
这道题系统没法提交,所以不知道能否AC,但我感觉程序没啥问题,比较简单,可以跑几个测试用例比对一下。题意容易理解,思路 是将所在的房间号和r个房间的开灯情况作为一个状态,这样最多会有10*2^10种状态,并不多。然后就是bfs宽度遍历了,要注意一点是人在某个房间中不可以把该房间的灯关上,所以我在输入的灯开关数组时候就做了一个判断,如果两个数字相同,也即控制该房间灯的开关就在这个房间时,开关是无原创 2013-11-10 15:48:27 · 969 阅读 · 0 评论 -
uva310 L-system L系统 哈希判重又TLE
这道题经过我反复试验发现,用哈希判重就是TLE,直接用map标记不会超时,感觉是哈希函数设计的不好,如果一位一位去计算确实复杂度有点高,最高可以有15位呢。。题意不太好懂,意思就是从给定的串中(第三行)遇到a就替换成输入第一行的某个非空子集,遇到b替换成输入第二行的某个非空子集,问是否可以生成第四行的字符串。我的做法是参考了别人的代码的,就是遇到a就替换成第一行,遇到b就替换成b,然后判断原创 2013-11-10 09:48:20 · 1233 阅读 · 0 评论 -
uva10422 bfs+哈希判重 TLE
调了半天,还是TLE,看了网上的代码基本没有用bfs+哈希判重做的,要么是dfs要么压根不用哈希判重,难道说bfs+哈希注定过不了?看了下程序只有算哈希函数的地方有一个25的循环比较累赘,别的地方循环不是很多,可是25位必须要循环才能算哈希函数额。。。求解释。#include#include#includeusing namespace std;const int MAX原创 2013-11-08 19:04:49 · 1111 阅读 · 0 评论 -
uva10603倒水问题宽度优先遍历!
利用bfs解题,以三个杯子中现有水量作为一个“状态”,从一个状态不断扩展新的状态加入排队数组,这样既可保证找到目标水量时是经过了最少次数的倒水操作。扩展新的状态节点是个稍微难一点的地方,先计算出i给j能倒得水量amount,等于i所剩水与j所差水的最小值。然后当amount!=0时进行倒水操作。vis是判重数组,只需要二维既可,因为三个杯子的水总量是不变的,两个杯子的水量相同时就表明是同一个状原创 2013-11-06 13:34:57 · 2104 阅读 · 0 评论 -
uva208 直接暴力会TLE,需要剪枝
不剪枝的话会TLE,因为节点最多有21个,回溯数据量还是很大。剪枝后AC通过时间15ms。。剪枝的方法是统计出哪些节点是有效的,所谓有效是该指节点与目标节点是直接或间接相连的,也就是通过这个节点必然会有一条通路到达目标节点。#include#includeusing namespace std;int des,count,MaxSta,C[25];bool vis[25],原创 2013-11-05 22:32:22 · 1612 阅读 · 0 评论 -
uva193继续回溯!!
简单的回溯问题,如果是PE的话很可能是最后一个后面还输出了空格加了一个count判断输出了几个数了,等于Max时就是最后一个节点,不要输出空格,输出换行即可。转载请注明出处,谢谢!http://blog.youkuaiyun.com/monkeyduck#include#includeusing namespace std;int m,n,k,Max,vis[105],res原创 2013-11-04 20:11:48 · 970 阅读 · 0 评论 -
uva140带宽问题
我自认为这题我做的比较精妙的地方在于求带宽的函数,我没有采用逐个比较的一般思路,而是根据位置进行直接判定最大带宽。一般思路要选定每个节点,然后将与该节点相连的节点记录下来,在排列中依次确定其距该节点的位置,取最大值作为该节点的带宽,而一个排列的带宽则是所有节点带宽的最大值,复杂度为O(n^n)。我做的复杂度要低得多,直接判断第一个位置和最后一个位置的节点在图中是否是相连的,如果是那么该排列的带宽一原创 2013-11-04 17:51:47 · 1498 阅读 · 0 评论 -
uva167 八皇后问题!输出固定宽度(#include<iomanip>)
简单的八皇后问题,多了一个棋盘,要求结果是皇后所在位置的数字和最大,只需要在dfs深搜时加入一个sum参数,每次确定皇后位置后加上该位置的数字大小即可。因为题目最后要求输出结果是5为宽度,所以需要包含iomanip头文件,然后用cout这条语句完成的功能就是输出Max值时限定宽度为n。但是作用范围只针对Max,也就是说如果Max后面还有要输出的内容就不受到setw的限制了。原创 2013-11-04 11:44:33 · 1248 阅读 · 0 评论 -
uva 165 卡住了一下午!
最近上网发现自己写的文章出现在很多人的博客上面,还不注明是转载,还是原创!面对这种行为我无力吐槽,转载还请注明出处。谢谢!http://blog.youkuaiyun.com/monkeyduck这道题题意不太好懂,说的是给定h和k两个数,h是邮票的张数,k是邮票面额的种类,h+k这个题最开始我是用的回溯套回溯的办法,因为面额要枚举,然后每一张怎么选也要枚举,但这样非常慢,后来参考网上别人的做原创 2013-11-01 21:09:19 · 1319 阅读 · 0 评论 -
uva10012 不是那么简单的,有陷阱!
这道题第一次做以为是一般的回溯题,最初的思路就是将各圆形全排列,放置新圆的时候让其与前一个圆相切,最后通过回溯得到矩形的最小size。十几分钟编完后结果WA,想了好一会发现问题所在,不能只让其与前一个圆相切(如果第一个圆很大,半径比方说是100,第二个圆很小,半径是1,第三个圆也很大,半径同样是100,放第三个圆的时候如果是和第二个圆相切则必定会与第一个圆相交,就不可以了)。然后就开始修改代码,然原创 2013-11-01 11:22:58 · 1144 阅读 · 0 评论 -
uva331
题目意思比较难懂(英文水平较菜),先翻译一下关键内容吧。交换一个数组的相邻两个元素可以达到对数组排序的功能,类似于冒泡排序,但交换的方案可能不止一种。比如说数组A【3】为3,2,1,要想排为1,2,3,可以先交换位置1和2的元素(数组变为2,3,1),然后交换位置2和3的元素(变为2,1,3),最后交换位置1和2的(变为1,2,3),此为方案一,具体可以用1,2,1(数字即每次交换的第原创 2013-10-31 13:44:20 · 1165 阅读 · 0 评论 -
uva10344 一次AC
题意是给定5个正整数,通过加,减,乘法运算计算23,计算顺序有一定的格式要求:For this problem we will only consider arithmetic expressions of the following from: where : {1,2,3,4,5} -> {1,2,3,4,5} is a bijective functionand {原创 2013-10-31 11:33:38 · 1215 阅读 · 0 评论 -
【困惑】uva301 一直TLE啊怎么破!
#include#includeusing namespace std;struct Order{ int sta,des,num;};int capacity,Bstation,norder,Max,stapass[8];bool vis[23];Order order[23];bool isok(int ord){ for (int i=order[ord].st原创 2013-10-30 17:10:54 · 955 阅读 · 0 评论 -
uva539 卡坦岛 简单回溯!
继续回溯搞起!开始想复杂了,用了好多数组判断节点的度、边是否已经走过,结果导致超时了,后来简化成如下版本,走过的标志不需要另辟vis数组,只要将map【i】【j】和map【j】【i】赋值0即可。#include#includeusing namespace std;int n,m,Max,map[30][30];void dfs(int node,int path) /原创 2013-10-30 15:35:20 · 1088 阅读 · 0 评论 -
uva639 回溯!
#includeusing namespace std;int n,Max,C[4][4];char board[5][5];bool vis[16];bool isok(int x,int y){ for (int i = x + 1; i < n && board[i][y] != 'X'; i++) if(board[i][y] == '0')原创 2013-10-29 20:12:22 · 981 阅读 · 0 评论 -
uva216 c++回溯法
因为题目要求最多8台电脑,所以可以枚举全排列,然后依次计算距离进行比较,枚举量8!=40320并不大,但这种方法不如回溯法好,当数据再大一些枚举就显得笨拙了,所以这个题我用回溯法做的,回溯有一个好处是一边生成序列一边判断,当判断这种情况下不可能满足要求时就停止向下递归,而返回上一层调用,减少运算量。输出的时候用到了固定小数点后几位数输出的技巧,不过我还是给忘了,翻了一下以前写的博客迅速找到了,原创 2013-10-29 11:56:15 · 1026 阅读 · 0 评论 -
[C++]uva729总是wa的看这里
如果你总是WA而又不知道哪里出了问题,那么你一定是输出时没有判断是否是最后一次循环,如果是最后一个test case则不要输出空格行!!if (cases) cout这个地方我WA了好久,话说这不应该是Presentation Error么!#include#include#include#includeusing namespace std;int ma原创 2013-10-28 14:32:28 · 1091 阅读 · 0 评论 -
【C++】uva10098
灰常简单,5分钟AC,求下一个排列,直接用库函数next_permutation搞定#include#include#includeusing namespace std;int main(){ int n; cin>>n; while(n--) { char str[11]; cin>>str; int len=strlen(str); sort(s原创 2013-10-28 13:31:08 · 1175 阅读 · 0 评论 -
uva146
用库函数next_permutation(p,p+n)做的,超时了。看了下不用库函数做的思路也挺简单的,从最后一个字母向前找,找到第一个比最后字母小的,交换位置,然后把后面字母增序排列。上一个超时的代码,很简洁漂亮#include#include#include#includeusing namespace std;int main(){ char p[60],d原创 2013-10-27 20:02:50 · 870 阅读 · 0 评论 -
uva131 Time limit exceeded
第一次提交超时(Time limit exceeded )了,想了半天不知道哪里能再简化。原来是主函数中写了while(1)循环,怪不得会超时,要写成while(cin>>ch)就好了。这个题不难,考察细致程度,当然要读懂题目,开始不明白输出那是些什么东西,查了度娘后明白了,现在把扑克规则粘贴过来供大家参考。下面列出从大到小的扑克牌面. 这是所有的扑克通用规则。1Royal Flu原创 2013-10-27 15:22:09 · 1373 阅读 · 0 评论 -
uva11205 生成子集
题目大意:数码管由七根LED灯管构成,其中若灯管有坏掉情况下有时仍能分辨出是什么数字。题目想问最少有几根灯管就可以分辨出所有的输入符号。抽象一下实际就是给出一个0,1矩阵,问至少需要几列可以区别所有的行。这道题开始不会做,看了生成子集算法才会的,幸亏输入数据不大,否则肯定超时了啊,AC过的时间都2000ms了。。我是用位向量法生成子集的,即用一个数组B【i】=1来表示i是否位于子集原创 2013-10-27 11:06:37 · 1422 阅读 · 0 评论 -
uva10167 简单的生成测试法
题意:有一块蛋糕,上面有2N个樱桃,问如何划分蛋糕保证两块大小一样且上面的樱桃也一样多。输出A和B,即代表Ax+By=0的一条切割线,这个题好在给定了A和B的范围是【-500,500】,所以枚举所有的A和B总共也就1000*1000的复杂度,是可以接受的,所以采用了枚举生成切割线,然后判断切割线两边的樱桃数是否一样多就没有什么难度了。有几个地方要注意1、初中数学就应该学过如何判断点和直线的原创 2013-10-26 10:42:23 · 1266 阅读 · 0 评论 -
uva784
#include#include#includeusing namespace std;char grid[35][85];bool visit[35][85];void fillgrid(int x,int y){ grid[x-1][y-1]='#'; grid[x-1][y]='#'; grid[x-1][y+1]='#'; grid[x][y-1]='#'; gr原创 2013-10-25 23:33:57 · 957 阅读 · 0 评论 -
uva657 persentation error的看过来!
题目大意:中文翻译就不给了,英文不难能读懂。题目大意是给出一幅图画,统计上面每个色子的点数,‘*’表示色子的区域,注意并不一定是标准形状,相邻的‘X’表示一个点数,每个色子的点数从1-6.最后要从小到大地输出各个色子的点数。读完题感觉这和前一篇日志里的油田问题差不多,仔细想想发现其实就是两次dfs,第一层dfs是深搜找‘*’,第二层dfs是找到‘X’后深搜找相邻的‘X’,所以整体难度不大。原创 2013-10-25 15:39:13 · 1281 阅读 · 0 评论 -
uva572 图和图的遍历,一次AC!
题目很简单,一次AC,思路是输入grid时就统计出共有多少个油井(‘@’),深度优先函数dfs(x,y,count)的三个参数是行号、列号和剩余的未访问油井数。主函数中从(0,0)开始遍历grid,当出现某个油井且未被访问时,油田计数器加1,接着递归调用dfs函数将与该油井相连(横、竖或对角线)的所有油井访问并标记,这些油井共同构成一块油田。主函数遍历到(m-1,n-1)时结束,所得的油田计数器即原创 2013-10-25 09:28:25 · 1791 阅读 · 0 评论 -
uva297 第一次又是runtime error 改了数组大小就AC了
大致思路是先建立两棵四叉树,然后相加得到新的四叉树,最后遍历新的四叉树统计出有多少个黑像素点。在相加的时候要注意剪枝,同一层黑像素块与其它相加最后肯定是黑像素块,空节点(白像素块)与其它任意节点相加无效果,还是的其它节点。只有parent加parent最复杂,需要递归调用函数将将其各自的四个子节点分别相加。统计黑像素点的时候也是递归求值,有一个技巧就是在全局建立一个数组存下每一层的像素数,比如0层原创 2013-10-24 13:26:02 · 1213 阅读 · 0 评论 -
uva548 二叉树问题 Runtime Error看过来!
第一次练习二叉树的相关操作,还是很有收获,期间遇到了几个问题。1、在delete节点时判断if(pNode==NULL)没用,不清楚为何,遂改了写法2、全局变量写在类外时,类内的函数不能直接用,如果定义在类内是可以的,只不过在main函数中要加tree.引用3、看网上的做法都是先建树,再dfs求路径最短,而我定义了一个sum域,保存根节点到该节点的路径和,如果判断该节点是叶子节点,则将原创 2013-10-23 15:50:39 · 1213 阅读 · 0 评论 -
uva133 利用指针编写双向循环链表
我看了网上的一下代码,基本都没有利用指针编写双循环列表的,我就试了一下,主要是想锻炼一下利用指针编基本的数据结构。虽然没有AC,是runtime error,因为数据量太小,利用指针反而没有什么优势,而且我的代码确实效率比较低,毕竟第一次编写双循环链表。通过这个程序还是发现了不少的问题,比如指针释放啊,循环的时候指针的指向啊,删除插入节点的写法啊,以及删除某个节点是还需要讨论其是否是头指针的后原创 2013-10-15 13:59:05 · 887 阅读 · 0 评论 -
uva10474 简单排序查找 一次AC
题目很简单,加上读题20分钟一次AC。还是用到了快排qsort。#include#includeusing namespace std;int cmp(const void* a,const void* b){ return *(int*)a-*(int*)b;}int main(){ int n,q; int col=0; while(cin>>n>>q&&n!=0原创 2013-10-13 17:28:30 · 1049 阅读 · 0 评论