摘要:
解题思路:转自:http://blog.csdn.net/lyy289065406/article/details/6647423 分析得非常好!!利用Huffman思想,要使总费用最小,那么每次只选取最小长度的两块木板相加,再把这些“和”累加到总费用中即可本题虽然利用了Huffman思想,但是直接用HuffmanTree做会超时,可以用优先队列做因为朴素的HuffmanTree思想是:(1)先把输入的所有元素升序排序,再选取最小的两个元素,把他们的和值累加到总费用(2)把这两个最小元素出队,他们的和值入队,重新排列所有元素,重复(1),直至队列中元素个数<=1,则累计的费用就是最小费用 阅读全文
摘要:
看到别人写的,觉得比较经典,存下来。语言是基础, 算法是灵魂, 思维是资本, 经验使历史。 做人做事交朋友是根本 阅读全文
摘要:
现在大三了,很多同学都开始找实习工作了。忙着去面试。偶然看到这篇文章,觉得讲得不错,就转发了。转自:http://topic.csdn.net/u/20091007/14/704a89ee-dc71-4e85-b0b0-92fb4ec44dcf.html做过无数笔试题,做过无数面试题,基本上没遇到过很重视语言细节的语言本身方面,可能会问问虚函数和多态,重载,作用域,存储方式,字节对齐,一般问的不多,或者根本不问相反,对待你不懂XX语言上,往往表现的相当宽容,我面试时坦言自己只会一点C,对方也表示没有关系,而我目标职位没有一个跟C是有点关系的比较重要的是,基本数据结构和算法,大规模数据处理技巧, 阅读全文
摘要:
这题和poj2299是一样的。而且测试数据还没那么强。当刷题吧~#include <iostream>#include <fstream>using namespace std;int a[1005],t[1005]; //t[]为暂存数组int cnt;void Merge(int l,int m,int r){ int i=l,j=m+1,k=0; while(i<=m && j<=r) { if(a[i]>a[j]) { cnt+=m-i+1; //a[j]是i以及i后面的逆序数 t[k++]... 阅读全文
摘要:
时间复杂度O(nlog2n)归并排序:void Merge(int l,int mid,int r){ int i=l,j=mid+1,k=0; while(i<=mid && j<=r) { if(a[i]>a[j]) { t[k++]=a[j++]; cnt+=mid-i+1; } else { t[k++]=a[i++]; } } while(i<=mid) t[k++]=a[i++]; while(j<=r) t[k++]=a[j++]; //将归并完成的结果复制到原数组中 for(i=0; i<k; i++) { a[l+i]=t[ 阅读全文
摘要:
陷阱啊!一开始我用冒泡排序(Bubble Sort)来统计。。晕,TLE。each case 50w.而一趟冒泡排序需要进行的是n-1,n-2,……,2,1,0的和次比较。即n*(n-1)/2次。总的时间复杂度为O(n^2).肯定是吃不消的。 于是,可以用归并排序来求它的逆序数,逆序即为它总共需要变换的次数。这样时间复杂度是nlog2n,而空间复杂度2n。利用归并求逆序关键是对子序列s1和s2在归并时(s1,s2已经排好序),若s1[i]>s2[j](逆序状况),则逆序数加上s1.length-i,因为s1中i后面的数字对于s2[j]都是逆序的。参考:http://www.slyar.c 阅读全文