Mathematics:DNA Sorting(POJ 1007)
2015-11-20 01:33
459 查看
DNA排序
题目大意:给定多个ACGT序列,按照字母顺序算出逆序数,按逆序数从小到大排列
这题其实很简单,我们只要用一个归并排序算逆序数,然后快排就可以了(插入排序也可以,数据量不大),但是要注意的是他要保持原来的顺序,fcmop那里要写当a.inverse=b.inverse时,返回0
#include <iostream> #include <functional> #include <algorithm> using namespace std; typedef int Position; typedef struct _set { char input[51]; int inverse; }Set; void Merge_Sort(Position, Position, int *const); void Merge(Position, Position, int *const); static Set input[105]; static char A[53], Tmp_Array[53]; int fcomp(const void *a, const void *b) { if ((*(Set *)a).inverse - (*(Set *)b).inverse == 0) return 0; return (*(Set *)a).inverse - (*(Set *)b).inverse; } int main(void) { int line_sum, length, inverse_num; while (~scanf("%d%d", &length, &line_sum)) { getchar(); for (int i = 0; i < line_sum; i++) { scanf("%s", input[i].input); strcpy(A, input[i].input); inverse_num = 0; Merge_Sort(0, length - 1, &inverse_num); input[i].inverse = inverse_num; } qsort(input, line_sum, sizeof(Set), fcomp); for (int i = 0; i < line_sum; i++) printf("%s\n", input[i].input); } return 0; } void Merge_Sort(Position Left, Position Right, int *const Inverse_Num) { if (Left < Right) { Position Mid = (Left + Right) / 2; Merge_Sort(Left, Mid, Inverse_Num); Merge_Sort(Mid + 1, Right, Inverse_Num); Merge(Left, Right, Inverse_Num); } } void Merge(Position Left, Position Right, int *const Inverse_Num) { Position Mid = (Left + Right) / 2, lpos = Left, rpos = Mid + 1, pos = Left; for (; lpos <= Mid && rpos <= Right;) { if (A[lpos] <= A[rpos]) Tmp_Array[pos++] = A[lpos++]; else { Tmp_Array[pos++] = A[rpos++]; (*Inverse_Num) += (Mid + 1 - lpos); } } while (lpos <= Mid) Tmp_Array[pos++] = A[lpos++]; while (rpos <= Right) Tmp_Array[pos++] = A[rpos++]; for (int i = Left; i <= Right; i++) A[i] = Tmp_Array[i]; }
相关文章推荐
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
- Kiwi,BDD行为测试框架--iOS攻城狮进阶必备技能
- Kiwi,BDD行为测试框架--iOS攻城狮进阶必备技能
- 从github上下载项目到eclipse中
- 【在HTML中调用CSS的方法】
- 2、UITextField的方法和属性
- 20151120 - 蓝牙鼠标与 WiFi 冲突的解决办法
- mysql 脚本暂存
- linux kernel source code阅读记录(一)LDS文件详解
- 关于spring的context:component-scan
- 【内容转载】iOS开发----Xcode7升级之后插件无法使用与不小心点击Skipbundle的解决办法
- 一些常用的正则表达式
- 理解Angular中的$scope
- find命令的exec参数使用---Linux学习笔记
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- 【转】测试计划
- UVA 11992 Fast Matrix Operations 线段树
- 博客施工暂时告一段落
- Android-AsyncTask初体验
- 声卡id