北大OJ_1007题:DNA Sorting
来源:互联网 发布:2015年度十大网络剧 编辑:程序博客网 时间:2024/04/30 14:04
该题的意思是输入指定数量的字符串,每个字符串的长度一样,找出每个字符串中逆序对,然后按逆序对的升序输出所以的字符串,逆序对相同的则按输入时的顺序输出。
此题的突破点在找逆序对,以下列举两种找出逆序对的方法。
穷举法找逆序对(时间复杂度为O(n^2))
#include <iostream>#include <string>#include <deque>#include <cmath>using namespace std;struct tagString{int nInvertedCount;string strSequence;};int main(){deque<tagString> mStrList;tagString mTagString;short n,m;cin >> n >> m;while( m > 0 ){cin >> mTagString.strSequence;int nInvertedCount = 0;for( string::size_type i = 0; i < mTagString.strSequence.size() - 1; ++i ){for( string::size_type j = i + 1; j < mTagString.strSequence.size(); ++j ){if ( mTagString.strSequence[i] > mTagString.strSequence[j] ){nInvertedCount++;}}}mTagString.nInvertedCount = nInvertedCount;if ( mStrList.empty() ){mStrList.push_back( mTagString );}else{int i = mStrList.size()-1;for ( ; i >= 0; --i ){if ( mStrList[i].nInvertedCount > nInvertedCount ){continue;}break;}mStrList.insert( mStrList.begin() + (i + 1), mTagString );}--m;}for ( deque<tagString>::size_type i = 0; i < mStrList.size(); ++i ){cout << mStrList[i].strSequence << endl;}return 0;}
归并排序找逆序对(时间复杂度为O(nlogn))
#include <iostream>#include <string>#include <deque>#include <cmath>using namespace std;int Merge( string& strSrc, int low, int mid, int high ){int i = low;int j = mid + 1;int nCount = 0;string strTemp( high - low + 1, 0 );int k = 0;while( i <= mid && j <= high ){if ( strSrc[i] <= strSrc[j] ){strTemp[k++] = strSrc[i++];}else{strTemp[k++] = strSrc[j++];nCount += j - k - low;}}while( i <= mid ){strTemp[k++] = strSrc[i++];}while( j <= high ){strTemp[k++] = strSrc[j++];}for ( k = 0; k < (high-low+1); ++k ){strSrc[low+k] = strTemp[k];}return nCount;}int MergeSort( string& strSrc, int low, int high ){int nCount = 0;if ( low < high ){int mid = ( low + high ) / 2;nCount += MergeSort( strSrc, low, mid );nCount += MergeSort( strSrc, mid + 1, high );nCount += Merge( strSrc, low, mid, high );}return nCount;}struct tagString{int nInvertedCount;string strSequence;};int main(){deque<tagString> mStrList;tagString mTagString;short n,m;cin >> n >> m;while( m > 0 ){cin >> mTagString.strSequence;string strTemp = mTagString.strSequence;mTagString.nInvertedCount = MergeSort( strTemp, 0, strTemp.size()-1 );if ( mStrList.empty() ){mStrList.push_back( mTagString );}else{int i = mStrList.size()-1;for ( ; i >= 0; --i ){if ( mStrList[i].nInvertedCount > mTagString.nInvertedCount ){continue;}break;}mStrList.insert( mStrList.begin() + (i + 1), mTagString );}--m;}for ( deque<tagString>::size_type i = 0; i < mStrList.size(); ++i ){cout << mStrList[i].strSequence << endl;}return 0;}
总结
理论上来说,第二种方法要快一些,但是第二种方法里在排序的时候存在很多的交换,在OJ上编译运行反而是第一种方法更快。
作者:山丘儿
转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46568015
0 0
- 北大OJ_1007题:DNA Sorting
- 北大 ACM 1007 DNA Sorting
- 北大ACM1007——DNA Sorting
- OJ_1007
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- DNA Sorting
- [Android]LayoutInflater的inflate方法半详解
- 输入一行字符串(单词和若干空格), 输出该行单词个数 这里用到判断字符与否的isalpha
- 好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果
- IOS - 音频
- Swift项目中调用Objective-C的库
- 北大OJ_1007题:DNA Sorting
- java 值传递 引用传递(又叫地址传递,对象传递)
- 【少年の轨迹】cocos2d-x3.0中LayerColor的锚点的修改
- PHP类与对象,构造函数和析构函数,加上this绑定详解
- Mysql的一条SQL优化(一)
- java笔记22 IO流1(字符流及缓冲区)
- 【龙书答案】第三章解析(未完成)
- 解决升级Xcode6后插件不能用的问题
- 学习笔记:axure 高级教程 2 复选框(添加判断条件)