摘要: 解题思路:这道题题意很明确,就是从整数 n 开始,如果 n 是偶数,把它除以 2;如果 n 是奇数,把它乘 3 加 1。用新得到的值重复上述步骤,直到 n=1 时停止。计算 i 到 j 之间的整数中,循环节长度的最大值。由于n 是不小于1000 000的整数,所以用递归虽然很方便,但是容易超时,后来改为递推仍然超时。其实想想有的数会重复计算,因此可以用数组保存下来,也就是我们通常所说的打表方法。注意:输出的整数 m 与 n ,不一定是 m<n,所以要做交换,使其满足条件。由于要求输出这两个整数,所以刚开始要保存下来。另外请注意编译环境问题,UVa中不支持__int 64 类型,支持 lo 阅读全文
posted @ 2012-02-24 17:23 笑巧 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 解题思路:本题内容虽长,但很好理解。其实就是在矩阵(m*n)中找出在不同行不同列中m个数字的最大和。但还必须满足条件,关键在于后一行的(选中的)数所在的列必须大于该行(选中的)数所在的列。这是道经典的DP,状态转移方程为:dp[i][j]=max(dp[i][j-1], dp[i-1][j-1]+v[i][j]).View Code 1#include<iostream>2usingnamespacestd;3#defineMAX1054#definemax(a,b)((a)>(b)?(a):(b))5intv[MAX][MAX],dp[MAX][MAX];67intmain 阅读全文
posted @ 2012-02-19 11:44 笑巧 阅读(757) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个数n,在1+2+3+4+…+k中,求随意改变加减号能使其和(差)正好为n的k为多少,使得k最小。解题思路:每次累加i: 如果sum小于n则无论如何也不可能达到题意; 如果sum正好等于n则累加到这个k正好为答案;如果sum大于n时,则需要把前面的加号改为减号:如果改为-1,结果就减2,如果改为-2,结果就减4,以此类推,可以看出只要sum-n为偶数,则此时可以改sum结果为n,得答案。View Code 1#include<iostream>2usingnamespacestd;3intmain()4{5intn,i;6while(cin>>n)7{8in 阅读全文
posted @ 2012-02-19 10:21 笑巧 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 解题思路:题目意思是找到判断是不是连通无环的图,首先想到的就是并查集。 1》判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。 2》判断连通的时候,只要判断根节点数为1即可。 注意:当输入的这组数据只有 0 0 时,依然是满足条件的,即应输出 "Yes"。View Code 1#include<iostream>2usingnamespacestd;3#defineMAX1000054intfather[MAX],flag,sign[MAX];56intFindSet(intx)7{8while(x!=father[x])9x=fa 阅读全文
posted @ 2012-02-18 21:10 笑巧 阅读(3936) 评论(0) 推荐(1) 编辑
摘要: 解题思路:题意明确,其实是最小生成树的一种变形,可以在读取输入时将已经建设的道路的费用看做是0,然后直接寻找最小生成树,得到生成树的耗费就是最短耗费。另外注意:用cin、cout输入输出则会超时,本来以为数据量不会太大,但改用scanf和printf后就AC了。 View Code 1#include<stdio.h>2#defineMAX0xfffffff3#definemax10545intmap[max][max],sign[max];6intmain()7{8intn,a,b,c,d,i,j;9while(scanf("%d",&n)&& 阅读全文
posted @ 2012-02-18 19:31 笑巧 阅读(679) 评论(0) 推荐(0) 编辑
摘要: 解题思路:题意很明确,就是求起点到终点的最短路,如果存在则输出该距离,否则输出 "-1"。求单源点的最短路径问题,我选用迪杰斯特拉算法,以前用过,所以比较熟悉。可这道题需要注意的地方很多,比如在输入时两个城镇之间可以有多条路,所以必须选择最短的一条;另外,在初始化时,城镇到自身的距离应该0,开始我一直初始化为最大值,在这里栽了很大跟头。以后会注意的。View Code 1#include<iostream>2usingnamespacestd;3#defineMAX0xfffffff4#definemax2055intmap[max][max],sign[max 阅读全文
posted @ 2012-02-18 10:38 笑巧 阅读(907) 评论(2) 推荐(0) 编辑
摘要: 解题思路:刚读完这道题后,不懂什么意思,感觉挺奇怪的。看了几遍题后,还是无从下手。通过动笔画画与测试数据结果对住了,觉得应该是这个意思,也确实是的。题目意思的正确理解应当是,从任意位置开始一直取到末尾,然后求其平均值,把这n个平均值中取最大的一个输出。也是按照贪心原则求解问题。 如Sample: 10 2 10 4 6 5 10 10 2 3 2 取 <1> (2 + 10 + 4 + 6 + 5 + 10 + 10 + 2 + 3 + 2 ) / 10 <2>(10 + 4 + 6 + 5 + 10 + 10 + 2 + 3 + 2) / 9 <3>( 4 阅读全文
posted @ 2012-02-03 15:59 笑巧 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 田忌赛马,经典的贪心,每次都用最快跟最快的,最慢的跟最慢的进行比较、判断1)若田最快的比王最快的慢,则用最慢的跟王最快的比,输掉一局;反之,则赢了当然是最划算的选择了2)若田最慢的比王最慢的还慢,则用最慢的跟王最快的比,输掉一局;反之,同上。具体解题思路如下:1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是 阅读全文
posted @ 2012-02-02 16:18 笑巧 阅读(476) 评论(0) 推荐(0) 编辑
摘要: 算法分析: 1. 将自已的牌a[]从大到小排,要求至少能胜多少round,其实是求最多输了多少轮,也就是求对手最多赢多少轮;2. 将对手的牌b[]从大到小排,如果自已的牌a[i]>b[j],对手可以用手头上最小的牌比较,再进行下一轮,如果a[i]<b[j],则算对手胜一轮!代码如下:View Code 1#include<iostream>2#include<algorithm>3usingnamespacestd;45boolcmp(intx,inty)6{7returnx>y;8}910intmain()11{12intm,n,i,a[55],b[ 阅读全文
posted @ 2011-12-28 19:13 笑巧 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 二分搜索算法问题描述:设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。并对自己的程序进行复杂性分析。算法设计:已知a[0:n-1]是一个已排好序的数组,可以采用折半查找(二分查找)算法。如果搜索元素在数组中,则直接返回下表即可;否则比较搜索元素x与通过二分查找所得最终元素的大小,注意边界条件,从而计算出小于x的最大元素的位置i和大于x的最小元素位置j。代码如下:View Code 1#include<iostream>2usingn 阅读全文
posted @ 2011-11-01 14:30 笑巧 阅读(2703) 评论(0) 推荐(0) 编辑