摘要:
原题链接题目大意:给定一个字符串,先用Morse Code编码,把编码倒序,再解码成字符串。现给定处理后的字符串,求原始信息。解法:用C++String类的函数。每次读入一个字符,就在string后面接上,并且保存字符对应morse码的长度。这里要声明一下,真正的morse码也是有句号、问号这些常用标点符号的,但不是题目里给出的那种形式。比如,句号是“.-.-.-”。参考代码:#include#includeusing namespace std;string code[30]={".-","-...","-.-.","-. 阅读全文
2014年2月27日
摘要:
原题链接题目大意:这是一道好题。在《算法导论》这本书里面,有一节是介绍如何求最大子序列的。这道题有点类似,区别是从数组变成了矩阵,求最大子矩阵。解法:完全没有算法功底的人当然不知道最大子序列这么经典的东西。所以先请教Google。我是参考了这篇文章的,tengpi.blog.163.com/blog/static/22788264200772561412895/。大意就是另开辟一个同样大小的矩阵,每个元素存放自左侧第一列到该元素的和。然后在纵向上用最大子序列的类似方法计算。参考代码:/* tengpi.blog.163.com/blog/static/227882642007725614128 阅读全文
摘要:
原题链接题目大意:模拟一个浏览器,打开一个网页、后退或者前进,输出网址。解法:用两个堆栈分别表示后退保存的网页和前进保存的网页。初始化时把当前页面压入后退堆栈的栈顶。要注意几点,一个是每次记得要清空两个堆栈,另一个,如果后退之后又打开了新的网页,前进的堆栈要清空,这和真实的浏览器的结果是一致的。参考代码:#include#include#includeusing namespace std;stack back;stack forw;int main(){ int n; cin>>n; while(n--){ string cmd,url="http://www.acm. 阅读全文
摘要:
原题链接题目大意:一群人聚众赌博。每个人先分别押注不同的金额,可以相互借钱。开奖之后,如果某个人的押注的金额正好等于任何其他三个人金额总和,那这个人就赢得其他三个人的赌注。如果同时有两个以上的赢家,押注金额最大的那个人是最终的赢家。首先输入玩家的个数,然后输入每个玩家的押注金额,经过运算输出赢家的财富(或者 no solution)。解法:参考代码:参考了下面链接的文章。首先,对所有押注金额进行从小到大排序,然后用枚举法试。因为并列的赢家取押注最多的获胜,所以从后往前试赢家的押注金额。稍作分析可知三个数当中,至少要有一个数在目标数的左边(小于),另外两个数可能在左边,也可能在右边(因为押注金额 阅读全文
摘要:
原题链接题目大意:判断一个数是不是palindrom。不限于十进制,可以在任何进制下判断。解法:还好,数字的范围不大,int类型足够搞定。方法就是从2进制开始,先把数字转换成2进制,判断是否对称,然后转换成3进制,直到16进制。这里的进制转换方法可以留意一下。参考代码:#includeusing namespace std;bool isPalindrom(int, int);int main(){ int i,n; while(cin>>n&&n!=0){ bool base[17]={false}, flag=false;; for(i=2;i<=16;i 阅读全文
摘要:
原题链接题目大意:已知三角形的三个顶点坐标,求其外接圆的周长。解法:刚看到这道题时,马上拿出草稿纸画图,想推导出重心坐标,然后求出半径,再求周长。可是这个过程太复杂了,写到一半就没有兴致了,还是求助于Google。在Wiki百科找到一个已知三条边长度,求外接三角形周长的算法,diameter = abc/2*(sqrt(s(s-a)(s-b)(s-c)),s=(a+b+c)/2。问题瞬间简化了,求两点距离是很方便的一件事,然后套用这个公式就可以了。参考代码:#include#include#include#define PI 3.141592653589793using namespace s 阅读全文
摘要:
原题链接题目大意:给一句话,把每个单词倒序,然后输出。解法:我是用了一个堆栈,以空格来拆分单词,把每个字母压入堆栈,然后依次输出。参考代码:/** 字符串反向,140ms,188kb* 单词反向用堆栈是比较方便的,一个个压入,遇到空格再一个个弹出* 但是不知道为什么耗时这么多,大批的人都是0ms,160kb,难道用字符串处理效率高这么多?*/#include#include#include#includeusing namespace std;int main(){ int i,j,n,cases; string str; char *p,c[80]; stack word; cin>& 阅读全文
摘要:
原题链接题目大意:首先学习一个生物学的单词,exon:外显子,DNA序列中能够翻译表达的片段。给出很多外显子的起始点和终点,求寻找包含最多外显子的一条链,并且输出这些外显子的编号。解法:先把所有外显子按照起始点的先后排序,相同起始位置的则看终止位置。然后就是一个一个查找,如果当前外显子的终点在下一个外显子之后,就跳过当前的;否则就输出当前外显子的编号。这里使用了vector来存储外显子。写了一段判断大小的代码,作为sort()函数的判断条件,有必要做个标记。参考代码:#include#include #include #includeusing namespace std;struct Exo 阅读全文
摘要:
原题链接题目大意:贪吃蛇的简化版,给出一串操作命令,求蛇的最终状态是死是活。解法:这条蛇一共20格的长度,所以用一个20个元素的队列表示,队列的每个元素是平面的坐标。每读入一条指令,判断其是否越界,是否咬到了自己。若都没有,把改点压入队列,front元素弹出。参考代码:#include#include#includeusing namespace std;struct Point{ int r; int c;};queue worm;bool isItself(queue,Point);int main(){ int i,n; char str[102]; Point temp; char x 阅读全文
摘要:
原题链接题目大意:有一种抽奖游戏乐透(Lotto),规则是从1到49这49个自然数中随机抽取6个数。现在有一种简化版的游戏,先在49个数里面选出k(6解法:输入的数字已经按照升序排列好了。数字范围不大,最多也就是13选6,所以可以暴力破解法。六层for循环解决问题。如果数据量再大的话,就要用深度优先搜索了。参考代码:#includeusing namespace std;int main(){ int k,i,s[13]={0}; int a,b,c,d,e,f; bool first=true; while(cin>>k&&k!=0){ if(!first){ c 阅读全文
摘要:
原题链接题目大意:Arbitrage这个单词的解释是“套利交易”,就是利用几个币种之间的汇率差价来赚钱。比如人民币兑美元6:1,美元兑欧元1.5:1,欧元兑人民币10:1,那么用9元人民币可以换1.5美元,1.5美元换1欧元,1欧元换10元人民币。这样一倒手,就赚了1元。这是闷声发大财的典型例子!解法:在做这道题的时候,又学会了一种新的算法(Floyd算法)。具体过程是开辟一个方阵,每行每列都对应一种货币,每个元素就是横纵两种货币的汇率。然后是一个三层循环,最外层的循环是表示过度节点的,这一层必须放在最外面,里面两层是行和列的扫描。如果经过某一个过渡点汇率增加了,就更新这个节点。这里还要注意一 阅读全文
摘要:
原题链接题目大意:给一个16位的数字,表示一个浮点数,按照规则转换成科学计数法表示。解法:注释比较清楚了,注意浮点运算的四舍五入问题。参考代码:#include#include#include#include#includeusing namespace std;int main(){ char in[16],out[16]; int i,j,n,exp,man,zero; double num; cout10-1e-6){ while(num>10-1e-6){ num/=10; exp++; } } else if(num=0){ cout-10)cout<<... 阅读全文
摘要:
原题链接题目大意:给定一串字符串,查找字符串里字母逆序排列的对数,按照由少到多的顺序把所有字符串进行排列。解法:用C++字符串string类的iterator,从每个字符串的起始开始,查找逆序字符的个数,然后用qsort方法按照reverseCount的大小快速排序。参考代码:#include#include#include#include#includeusing namespace std;struct DNAStr{ int index,reverseCount; string str;}DNA[102];int countReverse(string s){ int num = 0; 阅读全文
摘要:
原题链接题目大意:按照规则解码。26个字母分成三组,每一组按照顺时针移位编码。现在已知移动的位数,要求解码。解法:以前看过一本古典密码学的书,百度贴吧密码吧也有很多经典的加密方法,想什么凯撒移位、弗吉尼亚编码等等。古典密码学比现代密码学有趣多了。这道题可以开三个队列,先把字符串压入对应的队列,然后调整顺序,再合成输出。不难,稍烦。参考代码:#include#include#include#includeusing namespace std;int main(){ int k1,k2,k3,i,len,pos[100]; char str[100],c; queue s1; queue s2; 阅读全文
摘要:
原题链接题目大意:给出12个月的收入,求一个平均值。解法:没什么好说的,就是一个除法。参考代码:#includeint main(){ int i; float sum=0,k; for(i=0;i<12;i++){ scanf("%f",&k); sum+=k; } sum=sum/12; printf("$%.2f",sum); return 0;} 阅读全文
摘要:
原题链接题目大意:一道类似于简单图像压缩的题目。给定一个调色板,然后把24位真彩色按照就近原则聚类。解法:每个像素的色彩都是RGB三个值,相当于三维空间的一个点。所以当一个新的像素进来时,分别和调色板中的每一个颜色求欧式距离,距离最近的那个点就是应该归属的那个类。参考代码:#include#include#define R 0#define G 1#define B 2int target[16][3];int main(){ int i,j,min,index; int RGB[3]; float dist; for(i=0;i<16;i++){ scanf("%d%d%d& 阅读全文
摘要:
原题链接题目大意:浙大的破网络容量有限,太多人同时使用BBS就会系统崩溃。为了保持系统正常工作,过载时就需要切断部分用户。规则是把玉泉所有的建筑从1到n编号,设定一个常数m。从1开始数,第m幢建筑的网络被切断,然后再从1开始继续往下数。数到n之后回到第1幢。曹光彪大楼的编号是2,这是计算机学院的大本营。此题的目的就是根据上述规则,确定常数m,使得曹楼是全校最后一幢被切断网络的建筑。解法:在数学界有一个经典的约瑟夫环问题(Josephus Problem)。约瑟夫环问题是这样的,有n个人围成一个圈,分别编号为1,2,3…n,从第1个人开始报数,报到偶数的人出列,剩下的人继续,直到仅剩最后一个人位 阅读全文