【解题报告】openjudge DNA排序 数据结构与算法mooc 内排序
2017-11-25 16:28
721 查看
描述 现在有一些长度相等的DNA串(只由ACGT四个字母组成),请将它们按照逆序对的数量多少排序。 逆序对指的是字符串A中的两个字符A[i]、A[j],具有i < j 且 A[i] > A[j] 的性质。如字符串”ATCG“中,T和C是一个逆序对,T和G是另一个逆序对,这个字符串的逆序对数为2。
输入 第1行:两个整数n和m,n(0<n<=50)表示字符串长度,m(0<m<=100)表示字符串数量 第2至m+1行:每行是一个长度为n的字符串 输出 按逆序对数从少到多输出字符串,逆序对数一样多的字符串按照输入的顺序输出。
样例输入 10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT 样例输出 CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
原题链接:http://dsalgo.openjudge.cn/huawen10/3/
解题思路:
比较自然的分两步,先把每个字符串的逆序对数量数出来,然后再进行排序就好啦。
数逆序对的方法的话,从后向前遍历一遍,比如说某个位置是T,那以它为首个元素的逆序对数量就是后面所有的A+C+G的数量,其他字母类似。
ps:我大概比较喜欢归并排序- -这个相同数量按输入顺序输出的条件的话也要注意是要用稳定排序算法的。
以下代码:
#include <iostream> #include <string> using namespace std; struct dna { int num = 0; string s; }; dna a[101]; dna ta[101]; void merge(int left, int right, int middle) { int i, j, index1, index2; for (j = left; j <= right; ++j) ta[j] = a[j]; index1 = left; index2 = middle + 1; i = left; while (index1 <= middle && index2 <= right) { if (ta[index1].num <= ta[index2].num) { a[i] = ta[index1]; ++i; ++index1; } else { a[i] = ta[index2]; ++i; ++index2; } } while (index1 <= middle) { a[i] = ta[index1]; ++i; ++index1; } while (index2 <= right) { a[i] = ta[index2]; ++i; ++index2; } } void mergesort(int left, int right) { int middle; if (left < right) { middle = (left + right) / 2; mergesort(left, middle); mergesort(middle + 1, right); merge(left, right, middle); } } int main() { int n,m; cin >> n>>m; 9a29 for (int i = 0; i < m; ++i) { cin >> a[i].s; } for (int i = 0; i < m; ++i) { int count[4] = { 0,0,0,0 }; for (int j = n - 1; j >= 0; --j) { if (a[i].s[j] == 'A') { ++count[0]; } if (a[i].s[j] == 'C') { a[i].num += count[0]; ++count[1]; } if (a[i].s[j] == 'G') { a[i].num += (count[0]+count[1]); ++count[2]; } if (a[i].s[j] == 'T') { a[i].num += (count[0] + count[1]+count[2]); ++count[3]; } } } mergesort(0, m - 1); for (int i = 0; i < m; ++i) cout << a[i].s << endl; //system("pause"); return 0; }
转载请注明原文链接。
想要浏览更多的学习内容可以看看博主更多其他的博文哦~
http://blog.csdn.net/weixin_38062864
相关文章推荐
- Pku acm 2239 Selecting Courses 数据结构题目解题报告(十二)---- 匈牙利算法求二分图的最大匹配
- Pku acm 1274 The Perfect Stall 数据结构题目解题报告(十三)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2536 Gopher II 数据结构题目解题报告(十四)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2771 Guardian of Decency 数据结构题目解题报告(十五)---- 匈牙利算法求二分图的最大匹配
- Pku acm 1125 Stockbroker Grapevine 数据结构题目解题报告(八)---- 弗洛伊德(floyd)算法
- Pku acm 3041 Asteroids 数据结构题目解题报告(十六)---- 匈牙利算法求二分图的最大匹配
- 【解题报告】poj openjudge 拼写检查 pku数算mooc 检索
- 【解题报告】openjudge Freda的越野跑 数据结构与算法mooc 内排序
- Pku acm 1469 COURSES 数据结构题目解题报告(十一)---- 匈牙利算法求二分图的最大匹配
- 数据结构与算法-选择排序
- 数据结构与算法——线性时间排序(计数排序、基数排序、桶排序)
- ZOJ2112 Dynamic Rankings 解题报告【数据结构】【分块】
- 数据结构基础算法整理归纳:选择排序(四)
- 数据结构与算法——插入类排序(直接插入排序,希尔排序)
- BZOJ 2131 数据结构优化DP 解题报告
- 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)
- 【数据结构与算法】选择排序
- <三>java数据结构与算法 选择排序
- Java数据结构与算法:排序
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)