总时间限制: 1000ms 内存限制: 65536kB
描述
给出一系列基因序列,由 A,C,G,T 四种字符组成。对于每一个序列,定义其逆序对如下:
序列中任意一对字符 X 和 Y,若 Y 在 X 的右边(不一定相邻)且 Y < X,则称 X 和 Y 为一个逆序对。
例如 GAC 这个序列,其中 GC,GA 都是逆序对。
一个序列的逆序对越多,则认为其 "无序度" 越高。你的任务是将基因按照无序度从小到大的顺序排序,如果存在无序度相同的序列,则按照原始输入顺序输出。
输入
首先是基因序列的长度 n (0 < n <= 50) 和基因序列的个数 m ( 0 < m <= 100).
然后依次是这 m 个基因序列.
输出
输出排序后的 m 个基因序列。
样例输入
1 2 3 4 5 6 7
| 10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
|
样例输出
1 2 3 4 5 6
| CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
|
思路
方法一:使用 STL 的 array 和 pair
- 使用
array<pair<string, int>, 102> a;
来存储字符串和无序度。
- 读入字符串,计算无序度。
- 使用冒泡排序,按照无序度从小到大排序。(其实,也可以使用别的排序方法,只要稳定性好就行)
方法二:使用结构体数组
- 使用结构体数组
struct DNA
来存储字符串和无序度。
- 读入字符串,计算无序度。
- 使用冒泡排序,按照无序度从小到大排序。(其实,也可以使用别的排序方法,只要稳定性好就行)
Code
C++
使用 STL 的 array 和 pair
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <bits/stdc++.h> using namespace std;
int main() { int n, m; cin >> n >> m; array<pair<string, int>, 102> a; for(int i = 1, count = 0; i <= m; i++) { count = 0; cin >> a[i].first; for(int j = 0; j < n; j++) { for(int k = j+1; k < n; k++) { if(a[i].first[j] > a[i].first[k]) count++; } } a[i].second = count; } for(int i = 1; i <= m-1; i ++) { for(int j = 1; j <= m-1; j++) { if(a[j].second > a[j+1].second) { a[0] = a[j]; a[j] = a[j+1]; a[j+1] = a[0]; } } } for(int i = 1; i <= m; i++) cout << a[i].first << endl; }
|
使用结构体数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <bits/stdc++.h> using namespace std;
struct DNA { char first[53]; int second; };
int main() { int n, m; cin >> n >> m; DNA a[103]; for(int i = 1, count = 0; i <= m; i++) { count = 0; cin >> a[i].first; for(int j = 0; j < n; j++) { for(int k = j+1; k < n; k++) { if(a[i].first[j] > a[i].first[k]) count++; } } a[i].second = count; } for(int i = 1; i <= m-1; i ++) { for(int j = 1; j <= m-1; j++) { if(a[j].second > a[j+1].second) { a[0] = a[j]; a[j] = a[j+1]; a[j+1] = a[0]; } } } for(int i = 1; i <= m; i++) cout << a[i].first << endl; }
|
我的测试用例
测试用例 1
输入
1 2 3 4 5 6 7
| 10 1 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
|
输出
测试用例 2
输入
输出
测试用例 3
输入
1 2 3 4 5 6 7
| 10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
|
输出
1 2 3 4 5 6
| CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
|