POJ 1007 DNA Sorting
来源:互联网 发布:软件设计师考试教程 编辑:程序博客网 时间:2024/06/01 22:47
POj 1007,属于快速排序吧,下面为题目大意
输入:
第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。
输出:
输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。
样例输入:
10
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
样例输出:
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
排序程度从好到差就是每个字符串的逆序数从从小到大,如案例输出的第一个字符串的逆序数为6,第二个为10,第三个为11,
<span style="font-size:12px;"># include<iostream># include<string>using namespace std;int m; //定义全局变量,保存st的字符个数,供每个对象使用class Str{public:int num;string st;void count();Str(){num = 0;}};void Str::count() //计算逆序数{int i, j;cin >> st;for (i = 0; i < m - 1; i++) //使每个字符都与后面的字符进行比较{for (j = i + 1; j < m; j++){if (st[i]>st[j])num++; //记录逆序数}}}int main(){int n,i,j; cin >> m >> n;Str temp;Str *p = new Str[n]; //为Str数组动态开辟一段空间,动态分配n个对象空间,并把首地址赋给指针p,Strfor (i = 0; i < n; i++){(p + i)->count(); //调用count函数}//cout << "排序后:" << endl;for (i = 0; i < n-1; i++) //通过num的大小为Str数组排序{for (j = i + 1; j < n; j++){if ((p + i)->num >(p + j)->num) //如果前面的大于后面的就进行交换{temp = *(p + i);*(p + i) = *(p + j);*(p + j) = temp;}}}for (i = 0; i < n; i++)cout << (p + i)->st << endl;//通过指针指向的对象访问对象的成员st(和num)delete[]p; //释放动态开辟的空间return 0;}</span>
以上为C++类的做法,没有用到标准库的sort函数,看了网上其他人的做法,如下(此举用了二维数组思想和结构体,以下转载来自HuangLianzheng 。)
#include<iostream>using namespace std;int main(){int n,m,i,j,num,a[101],b[101],t,k; char str[101][51],str1[51]; cin>>n>>m; for(i=0;i<m;i++) {cin>>str[i]; num=0; for(j=0;j<n-1;j++) for(k=j+1;k<n;k++) if(str[i][j]>str[i][k]) num++; a[i]=num;} for(i=0;i<m;i++) { b[i]=0; t=a[0]; for(j=1;j<m;j++) if(t>a[j]) {t=a[j]; b[i]=j;} a[b[i]]=1250;} //这里a[b[i]]=1250其实就是把一个足够大(大于 (1+..+49)就行了)的实数付给刚才选出最小的数组元素,使下次的选择不把它包括进来。 for(i=0;i<m;i++) cout<<str[b[i]]<<endl; return 0;}
#include <iostream>#include <cstdlib>using namespace std;struct DNA{ string s; int value;};int cmp(const DNA *a, const DNA *b) { return (a->value-b->value); } int main(){ int n,m; while(cin>> m >>n) { DNA it[n]; for(int i=0;i!=n;i++) { cin >> it[i].s; it[i].value = 0; for(int j=0;j!=m;j++) for(int k=j+1;k!=m;k++) if(it[i].s[j]>it[i].s[k]) it[i].value++; } qsort(it,n,sizeof(DNA), (int (*)(const void *, const void *))cmp); for(int i=0;i!=n;i++) cout << it[i].s <<endl ; } return 0; } 实在很优秀,用结构体包含其字符串和对应的inversions个数,从而用快排把inversions和其对应的字符串一次排出。真是优越无比。这也是我初步认识快排函数和其实现方法。。。所学到的:1,快排函数的定义和其实现的方法,用结构体可以一次把多项数据通通排出。。 2,刚开始在后半部分的排序实在花了很多时间,以后不要急着写完代码就抱着侥幸心理去测试AC不AC 要把自己代码的思路全理清,觉得没破绽了才放上去,要不不通过的话又要在调试上面花很多时间,有句话说得好,欲速则不达,切记。。。
0 0
- POJ 1007 DNA Sorting
- poj 1007 DNA Sorting
- POJ 1007 DNA Sorting
- POJ-1007 DNA Sorting
- 【POJ】1007 DNA Sorting
- POJ-1007:DNA Sorting
- poj 1007 DNA Sorting
- POJ 1007 DNA Sorting
- POJ 1007 DNA Sorting
- poj 1007 DNA Sorting
- POJ 1007 DNA Sorting
- 【POJ】1007 DNA Sorting
- poj 1007 DNA sorting
- POJ 1007 DNA Sorting
- poj 1007 DNA Sorting
- [POJ][1007]DNA Sorting
- POJ 1007 DNA Sorting
- poj 1007 DNA sorting
- C++学习日志第三篇
- SpringMVC学习系列(3) 之 URL请求到Action的映射规则
- 大数相乘
- 底层库把我坑惨了
- valgrind
- POJ 1007 DNA Sorting
- c++设计模式之原型模式(protoptype)
- HDU 1195 Open the Lock (BFS 剪枝)
- 编辑距离问题
- 关于aircrack-ng的一些学习笔记及问题
- JAVA常用集合框架用法详解基础篇三之Colletion子接口Set
- caffe源码分析:layer.hpp分析
- 机器学习实战(5)--SVM(Support vector machine)(六)--Python实现
- 【BZOJ1025】[SCOI2009]游戏【计数DP】【质因数分解】【置换】