uva
文章平均质量分 52
omsobliga
这个作者很懒,什么都没留下…
展开
-
216 - Getting in Line(***)使用顺序数组存储状态
/*推荐题型:三星,有技巧要掌握,顺序数组存储状态题意:每台电脑上之间铺上电缆,问电缆最短为多少思路:深度优先搜索,递归中使用形参存储搜索状态*/#include #include #include struct node{ int x,y;}com[10];double G[10][10],res;bool visit[10];int next[10],ans[10原创 2012-02-18 22:28:40 · 498 阅读 · 0 评论 -
11234 - Expressions*****
/*题意:根据后缀表达式,输出使用队列实现相同效果的序列需要用到栈、队列、二叉树*///无指针,推荐,可是未通过!!!#include #include #include #include #include #include using namespace std;const int kMax=10007;struct Node{ int parent,left,r原创 2012-01-21 20:43:24 · 523 阅读 · 0 评论 -
540 - Team Queue***
//提交未成功#include #include #include #include using namespace std;const int nMax=1005;struct Queue{ int q[nMax]; int front,rear; Queue():front(0),rear(0){}}queue[nMax];struct Team{ int t[nMa原创 2012-01-20 23:19:49 · 470 阅读 · 0 评论 -
10474 - Where is the Marble?(****好题)
正常的思路,做出来结果超时。//Time limit exceeded#include #include #include using namespace std;#define MAXN 10000int one[MAXN],two[MAXN],pos_two[MAXN];int N,Q;int find(int x){ for(int i=0;i<N;i++)原创 2012-01-15 23:59:03 · 456 阅读 · 0 评论 -
755 487--3279(***)
思路:一次排序,一次推移,分步实现#include #include #include #include #define MAXN 100000char dir[MAXN+10][10];char line[1000];//数组实现巧妙转换char one[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";char two[]="2223334445556667N原创 2012-01-15 00:44:48 · 956 阅读 · 0 评论 -
10391 - Compound Words(***)字符串的哈希函数
/*题意:一组单词,是否可以分解成两个单词思路:可以进行重组(一种时间效率为n,但空间分配为n*n,一种时间效率为n*n,空间分配为n)也可以进行分拆,效率为n*m,其中m为单词平均长度。主要学习:字符串的哈希处理另外看别人的代码学习到的新技巧:char str[n][m];int r[n];借助r来实现对str的排序。步骤:for(int i=0;i<n;i++)r[i原创 2012-02-16 22:36:01 · 544 阅读 · 0 评论 -
103 - Stacking Boxes
/*题意:矩形嵌套类型,不过是多维,要求输入k个n维图形,求可嵌套个数最大的一组,输出最大个数和字典序最小的那一组。一次AC,典型动态规划题。*///#define TEST#include #include #include bool map[35][35];int d[35],box[35][15];int next[35],ans[35];int k,n;int cm原创 2012-04-26 14:30:03 · 396 阅读 · 0 评论 -
116 - Unidirectional TSP
/*题不难,不过做的时候状态没有考虑清楚,所以耗时很大。出发和结尾无限制,字典序越小越好。重点注意:状态是二维的,所以要是做存储结构时,也要注意必须使用二维数组,否则会冲掉一些数据。题意:旅行商问题,从第一列走到最后一列,耗时最少需要怎么走,走法受限制,第一行和最后一行相邻。*///#define TEST#include #include const int nMax=107原创 2012-04-26 15:16:59 · 576 阅读 · 0 评论 -
10405 Longest Common Subsequence
/*最长公共子序列问题,一次AC。简单题,找出状态转移即可题意:一串字母,求最长子序列字母个数(只需要字母先对顺序一样即可,不需要连在一起)思路:if(line[x1]==line[x2]) d(x1,x2)=d(x1+1,x2+1)+1;else d(x1,x2)=max(d(x1,x2+1),d(x1+1,x2));*///非递归实现#include #include原创 2012-04-26 15:41:22 · 578 阅读 · 0 评论 -
112 - Tree Summing***
/*第一次接触建树解题简单建树、历编,求和问题解题思路:递归方法一:只保留树的节点部分方法二:建一棵完整的树cin.clear()清除*//*方法一:#include #include using namespace std;bool ok;bool tree_sum(int n,int sum){ char ch; cin>>ch; int v; if(!((原创 2012-01-31 21:45:44 · 753 阅读 · 0 评论 -
10106 - Product()
简单大整数相乘的问题需要注意事项:①对字符串处理要用memset(a,'0',sizeof(a));不可将'0'误写成0,memset可对字符数组进行任意赋值,处理长度为一个字节②前置零处理③单个零的特殊处理//通过#include #include int main(){ char x[260],y[260],mul[520]; while(s原创 2012-01-12 22:41:27 · 430 阅读 · 0 评论 -
424 - Integer Inquiry
简单的大整数相加,主要需要考虑的事项:①前置零的清除,但必须保留一位②sum要逆序输出#include #include #define M 110int main(){ int sum[M]; char add[M]; memset(sum,0,sizeof(sum)); while(scanf("%s",add)==1 && strcmp(add,"0")原创 2012-01-12 22:27:05 · 389 阅读 · 0 评论 -
307 Sticks(*****)经典DFS+剪枝
/*推荐题型:五星 经典DFS + 剪枝题意:长度相同的木棒被分成许多段,求木棒原来状态的最短长度此题重在剪枝,主要剪枝思路有:使用数组a存储被分解成的各个部分的长度,木棒的每段被称之为s①搜索范围从max到sum,且必须能被sum整除②为避免重复,组合成木棒的s从大到小排序,每根木棒的第一个s,也要求从大到小排序③在某层搜索中,如果a[i]没有使用,且a[i]==a[i+1],则原创 2012-03-09 22:29:48 · 793 阅读 · 0 评论 -
167 - The Sultan's Successors(****)八皇后问题
/*推荐题型:四星,没有解出。。。带权值的八皇后问题思路:按行进行搜索,数组p记录每行皇后所在列。每次搜索到第八行,进行一次处理即可。*/#include #include int G[10][10];int a[10],b[10],c[20];int p[10];int ans;void dfs(int cur){ if(cur==8) { int num=0原创 2012-02-17 22:10:35 · 716 阅读 · 0 评论 -
10344 - 23 out of 5(***)
/*题意:用五个数字和三个运算符组成一个表达式,最后答案是否为23超时!不过dfs1和dfs2的搜索顺序变一下可使效率提高一些。小技巧。不太清楚为什么时间效率会存在不同。。。。*/#include #include int aa[5],a[5],visit[5];int o[4];bool ok;int opre(int a,int op,int b){ int c=0原创 2012-02-18 22:31:01 · 543 阅读 · 0 评论 -
539 The Settlers of Catan
/*一次AC,简单题纠错经历:①处需要正反标记题意:每一条边只能走一次,求最长线。思路:回溯*/#include #include int n,m;bool G[30][30],visit[30][30];int ans;void dfs(int cur,int count){ bool ok=false; for(int i=0;i<n;i++) if(G[c原创 2012-03-06 06:38:12 · 683 阅读 · 0 评论 -
193 - Graph Coloring(*****)推荐入门
/*推荐题型:五星题意:对图中节点进行染色,只有黑白可选,要求相邻节点不同色,问黑色最多可有多少个思路:深度搜索、记忆数组*/#include #include const int nMax=107;int G[nMax][nMax];int ans[nMax],res,n;//answer,resultvoid dfs(int cur,int *A){ int col原创 2012-02-17 22:09:19 · 532 阅读 · 0 评论 -
301 Transportation(****)
/*推荐题型:四星题意:从A到B,接受那些订单可使船的受益最大。要求订单要么完全接受,要么完全拒绝思路:子类枚举,回溯回溯概念:在递归构造过程中,生成和检查过程有机结合起来,从而减少不必要的枚举。并不仅仅是指将状态恢复到原来的情况。*/#include #include #include int n1,n2,n3;struct Node{ int a; int b;原创 2012-03-06 06:35:47 · 551 阅读 · 0 评论 -
639 Don't Get Rooked
/*一次AC,题不难。找错经历:①处出错,不能使用sizeof()计算形参中数组长度②G的状态应分三种情况讨论。题意:一个棋盘,放置rook,要求不能在同一行或同一列,除非中间有墙。思路:回溯+状态存储,G值为0表示有墙,为1表示可放,为-1表示有冲突。*/#include #include int n;int ans;void dfs1(int (*G)[7],int原创 2012-03-06 06:36:42 · 593 阅读 · 0 评论 -
165 Stamps(*****)推荐
/*推荐题型:五星,题很不错,锻炼思维。想到了要进行两次递归搜索,一次选值,一次判断。但是选值时会出现问题,因为无法知道上届。所以遇到了瓶颈,看别人代码后,很不错。dfs中的嵌套在两条if语句中,所以程序肯定会存在终止的情况。题意:k种邮票,面值自定,共h张,求可组合成的最大值。要求从1开始连续。*/#include #include int h,k;int ans[15],res原创 2012-03-06 08:08:58 · 576 阅读 · 0 评论 -
140 Bandwidth
/*题目不难,一次AC题意:将图中各节点排在一条线上,依次找出各节点到相邻节点的最长距离,各节点最长距离的最大值即为带宽。输出带宽最小的序列,和带宽的值,如果出现多种情况,输出字典序最小的那种。思路:深搜+回溯+状态存储*/#include #include #include #include char line[100];bool G[30][30],visit[30];原创 2012-03-06 06:34:02 · 616 阅读 · 0 评论 -
331 Mapping the Swaps(***)题不错
/*使用冒泡排序更好,WA思路:首先计算出最小移动次数,再进行dfs深搜思路很重要,有了思路就去实现,如果思路能够得到一些改进更好!*/#include #include int n;int A[10];int min;int ans;int c[50];int search(){ int AA[10]; memcpy(AA,A,sizeof(A)); int i原创 2012-03-09 22:28:33 · 539 阅读 · 0 评论 -
348 - Optimal Array Multiplication Sequence
/*典型动态规划题型,一次AC题意:矩阵相乘,要求输出运算次数最少的运算式思路:以第k个乘号为一个状态,状态方程:d(x1,x2)={max(d(x1,k)+d(k+1,x2)+x1*k*x2)|k属于[x1,x2)}使用数组ans[x1][x2]存储相应的k值,最后使用递归输出!*/#include #include const int nMax=15;long long原创 2012-04-26 17:00:29 · 568 阅读 · 0 评论 -
10304 Optimal Binary Search Tree
/*最优搜索二叉树,典型动态规划题,AC搜索二叉树首先满足二叉树中序遍历是自小变大的,最优搜索二叉树则要求每个节点的路径长和它出现的概率之积的和最小。最优搜索二叉树的左子树和右子树必须也是最优搜索二叉树,否则根据“剪贴”原理,还能找到一个比现在二叉树更优的一颗二叉树所以可以得到状态转移方程:f[i][j]=min{f[i][k-1]+f[k+1][j]+sum(i,j)-a[k] | k原创 2012-04-30 16:43:02 · 952 阅读 · 0 评论 -
993 - Product of digits
/*一次AC题意:输入N,求出最小的Q,其中Q的所有位数相乘等于N。如果不存在输出-1。product of digit.其中product的意思就是相乘的意思。贪心策略:N每次除以[2,9]之间可整除的最大数,并将这个数作为Q的最后一位,循环直到N<10,这时Q也最小。为方便书写程序,Q使用数组表示。*/#include int N;int Q[10],top;void原创 2012-05-09 08:36:43 · 586 阅读 · 0 评论 -
UVA 11100 The Trip, 2007
/*WA题意:一伙人要去旅游,旅行商分配给他们n个包。但不让带太多的包上飞机,所以他们一个包嵌套一个这样来使外面总包数尽量小。输出外面最小包的个数和嵌套的序列。输入为n的值,和这n个包的体积。贪心策略:从体积最大的包a开始,把体积比它小的包中最大的哪一个b放入a中,这样再对b进行同样的操作,知道所有的包都被访问。结果WA,网上的解法,首先求出最少可分成的堆数K,然后依次输出各个序列。见原创 2012-05-09 12:35:33 · 917 阅读 · 0 评论 -
108 Maximum Sum
/*推荐题型:四星。 动态规划题意:输入矩形长度N,矩形中节点上的数值A[i][j],输出子矩形所包含节点的数值之和的最大值。动态规划策略:状态:d[lx][ly][rx][ry]表示矩形(lx,ly,rx,ry)中的最大值。状态转移方程:d[lx][ly][rx][ry]=max(d[lx+1][ly][rx][ry],d[lx][ly+1][rx][ry],d[lx][ly原创 2012-05-09 23:47:54 · 667 阅读 · 0 评论 -
10245 - The Closest Pair Problem
/*推荐题型:三星,最近点对问题,典型分治法问题题意:N为坐标个数,随后输入N个坐标,输出距离最近的两坐标的距离分治策略:原来做这道题的时候观察n<10000,所以效率为N*N时也可以,想到了使用两个循环,然后剪枝,通过。后来看别人代码,发现原来可以使用分治的,典型的分治问题,修改后的代码见方法二:*/#include #include #include const int原创 2012-05-09 16:27:23 · 702 阅读 · 0 评论 -
10494 - If We Were a Child Again大总结
大整数问题之终结篇,除法运算最为复杂主要操作:①字符数组转置,头部存储个位,这样可使操作更为方便一些②头置零的处理,但需要保证单个零的完整输出③字符和整数,切勿混淆‘0’和0④估算最后结果大致为多少位,定义MAXN注意:①处有补充!初始化时要注意一下//未通过#include #include int const MAXN=1000;usi原创 2012-01-12 23:06:37 · 418 阅读 · 0 评论 -
UVA 138 Street Numbers
/*题意:m个数,找出n,使得[1,n-1]和[n+1,m]所有数之和相等,输出10组数据!*///打表程序#include __int64 bsearch(__int64 l, __int64 r){ __int64 left = l; __int64 right = r + 1; while(left < right ) { __int64 mid = left + (原创 2012-05-17 16:49:07 · 557 阅读 · 0 评论 -
10229 - Modular Fibonacci
使用矩阵实现Fib的运算/*推荐:四星题意:Fib数列,输入n、m,输出F[n] % 2^m思路:正常的解法会导致超时,网上看到一种解法,使用矩阵乘法加速,然后分治求解。*/#include const int nMax = 30;long long a[4],b[4];int M;void bsearch(int n){ if(1 == n) { a[0]原创 2012-05-18 11:29:47 · 653 阅读 · 0 评论 -
10056 - What is the Probability ?
/*简单概率题,一次AC*/#include int main(){ //freopen("f://data.in", "r", stdin); int T; scanf("%d", &T); while(T--) { int N, I; double p; scanf("%d %lf %d", &N, &p, &I); double q, t; int i原创 2012-05-18 20:42:17 · 631 阅读 · 0 评论 -
10125 - Sumsets(*****)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=111&page=show_problem&problem=1066/*推荐题型:五星题意:从数集中找出满足条件:d=a+b+c的所有情况,输出d可取的最大值hash函数处理,使用数组head和next来实现。*/#i原创 2012-02-14 19:09:38 · 690 阅读 · 0 评论 -
10954 - Add All
/*推荐题型:三星,使用两个数组存储数据方便找到最小值贪心,一次AC题意:一个集合的整数,将其中两个数相加,结果为花销。然后花销加入到整数集合中,求最后花销为多少?贪心策略:每次找到集合中最小的两个数相加*/#include #include const int nMax=5007;int A[nMax],a_pos;int B[nMax],b_front,b_rea原创 2012-05-09 00:15:31 · 561 阅读 · 0 评论 -
10020 - Minimal coverage
/*区间覆盖问题,一次AC题意:使用题中所给坐标[Li,Ri]覆盖[0,M],如果不能覆盖输出0,如果可以,输出使用最少坐标的情况,并输出其序列,要求按Li进行排序。思路:其中刘汝佳书中有这道题的详细思路,但是我感觉实现起来蛮复杂,所以使用自己的思路进行解答。首先按Li对坐标进行排序,找出其中Lil如果满足,则转变为对[Ri,M]的覆盖,如果不满足则结束。贪心思路即:按Li进行排序,寻原创 2012-05-09 00:16:25 · 575 阅读 · 0 评论 -
10905 - Children's Game
/*推荐题型:三星特殊排序,其实就是贪心吧题意:输入N个整数,由这些整数组成一个大整数,求组成所有大整数中最大值思路:首先从局部考虑两个整数如果满足a+b>=b+a,则a需要排在b之前,这就是排序的判断条件。只需要在cmp中定义即可。*/#include #include #include const int nMax=57,mMax=500;char str[nMax原创 2012-05-05 20:07:39 · 548 阅读 · 0 评论 -
11258 String Partition(最大int型)
/*推荐题型:四星,原来不会做!最大int型问题,总感觉这类问题中用到了一些估算。因为有些步骤想不清楚状态d[i]表示,到i为止,所组成的最大整数状态转移方程为:d[i]=max{d[k]+sum(k+1,i) | k<i}注意:如果用到了不常用的数类型,如:long long,很容易会有遗漏,要多注意。*///#define TEST#include #include原创 2012-04-30 23:33:36 · 620 阅读 · 0 评论 -
10069 - Distinct Subsequences(高精度+动态规划)
/*强力推荐:五星,WA!!!首先要用到高精度处理。动态规划的使用这里有点小问题,原来我的想法,d[i][j]表示line1从i和line2从j开始的不同子序列个数。d[i][j]=sum{d[i+1][k] | k属于(j,len2)}。状态有len1*len2种,状态转移有len2种。另一种解法:d[i][j]=d[i][j+1];if(line1[i]==line2[j]) d[原创 2012-04-30 13:33:52 · 745 阅读 · 0 评论 -
11151 - Longest Palindrome
/*简单题求最长回文数,多阶段决策问题类动态规划题意:字符串S中包含的最长回文数为多长。即删除若干个字母后,剩余为回文数,问长度最长为多少。状态转移方程为:if(str[i]==str[j]) f[i][j]=f[i+1][j-1]+2;else f[i][j]=max(f[i+1][j],f[i][j-1]).*///#define TEST#include #incl原创 2012-04-30 20:28:11 · 702 阅读 · 0 评论 -
10453 - Make Palindrome
/*推荐:四星。这道题做得时候有些害怕,没有仔细去想。小感悟:动态规划题,试着去分析各个状态之间的联系,记住:去本上画出几个状态找其中的联系。这是关键,然后写出状态转移方程。注意:①处,因为将==误写成了=,导致WA了N多次,一直找不到原因,因为测试结果始终正确。题意:将字符串补全为回文数,问最少添加几个字母即可。*/#include #include const in原创 2012-05-01 10:17:25 · 831 阅读 · 0 评论