Openjudge-计算概论(A)-DNA排序

描述:

给出一系列基因序列,由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个基因序列。

样例输入

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

样例输出

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA思路:用结构体,统计每个字符串的逆序对个数,排序,输出即可。代码如下(本代码来自我的老师:http://www.cnblogs.com/huashanqingzhu/p/3575491.html):
 1 #include<stdio.h>
 2 struct DNA
 3 {
 4     char a[50];//一个基因序列
 5     int num;//本基因序列的逆序对个数
 6 };
 7 int niXuDui(struct DNA d,int len);//统计DNA序列变量d的逆序对个数
 8 int main()
 9 {
10     struct DNA  d[100],t;
11     int n,m,i,j,flag;
12     scanf("%d%d",&n,&m);
13     for(i=0;i<m;i++)
14     {
15         scanf("%s",d[i].a);
16         d[i].num=niXuDui(d[i],n);
17     }
18     for(i=1;i<m;i++)
19     {
20         flag=1;
21         for(j=0;j<m-i;j++)
22         {
23             if(d[j].num>d[j+1].num)//选择排序
24             {
25                 flag=0;
26                 t=d[j];
27                 d[j]=d[j+1];
28                 d[j+1]=t;
29             }
30         }
31         if(flag) break; //if(flag==1) break;
32     }
33     for(i=0;i<m;i++)
34     {
35         printf("%s\n",d[i].a);
36     }
37     return 0;
38 }
39 int niXuDui(struct DNA d,int len)//统计DNA序列变量d的逆序对个数
40 {
41     int ans=0,i,j;
42     for(i=0;i<len;i++)//从前到尾慢慢扫
43     {
44         for(j=i+1;j<len;j++)//两重循环,不多
45         {
46             if(d.a[j]<d.a[i]) ans++;
47         }
48     }
49     return ans;
50 }
时间: 2024-10-26 09:10:58

Openjudge-计算概论(A)-DNA排序的相关文章

计算概论(A)/基础编程练习2(8题)/7:整数的个数

1 #include<stdio.h> 2 int main() { 3 int k,temp,n[3] = {0}; 4 5 // 输入k个正整数 6 scanf("%d",&k); 7 8 // 循环读入和进行算术 9 while(scanf("%d",&temp)!=EOF) { 10 switch(temp) { 11 case 1: 12 n[0]++; 13 break; 14 case 5: 15 n[1]++; 16 br

计算概论(A)/基础编程练习2(8题)/5:点和正方形的关系

1 #include<stdio.h> 2 #include<math.h> 3 int main() { 4 // 输入坐标 5 float x, y; 6 while(scanf("%f %f", &x, &y) != EOF) { 7 // 计算坐标点与原点的欧氏距离 8 float dist=sqrt(x*x+y*y); 9 10 /* 11 // 简单判断横坐标和纵坐标的截距abs(x).abs(y)和与原点距离dist 注意:abs(

计算概论(A)/基础编程练习2(8题)/1:求平均年龄

1 #include<stdio.h> 2 int main() { 3 // 声明与初始化 4 int n, count=1, s=0, age=0; 5 6 // 输入学生人数 7 scanf("%d", &n); 8 9 // 循环读入 加和 10 while(count<=n) { 11 scanf("%d",&age); 12 s+=age; 13 count++; 14 } 15 16 // 计算平均年龄输出 17 pr

计算概论(A)/基础编程练习(数据成分)/1:短信计费

1 #include<stdio.h> 2 int main() { 3 // 输入当月发送短信的总次数n和每次短信的字数words 4 int n,words; 5 scanf("%d",&n); 6 float price=0.0; 7 8 while(scanf("%d",&words)!=EOF) { 9 // 所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送 10 price+=(words%7

计算概论(A)/基础编程练习1(8题):1:大象喝水

计算概论(A)/基础编程练习1(8题)/1:大象喝水 地址:http://pkuic.openjudge.cn/base1/1/ 1 #include<stdio.h> 2 int main() { 3 /* 圆周率常数 */ 4 const float Pi = 3.14159; 5 6 /* 深h厘米 半径r厘米 均为整数 */ 7 int h, r; 8 scanf("%d %d", &h, &r); 9 10 /* 一桶水的升数 1升 = 1000毫

【北大先修课】计算概论(A)题库全代码

题目很水就是全都是坑真是丧心病狂啊 把代码留下造福后来人QωQ 结构体与链表练习 生日相同2.0 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 200 using namespace std; struct st { int m,d; string name; bool operator&

POJ 1007:DNA排序

AC CODE: 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner input = new Scanner(System.in); 7 8 // 得到数据 9 int n = input.nextInt(); 10 int m = input.nextInt(); 11 String temp = input.nextLine();

poj 4086:DNA排序

poj 4086:DNA排序 题目 描述 现在有一些长度相等的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行:

报表也可以根据单元格计算后结果进行排序

熟悉报表的人都知道,报表中实现数据排序通常有三种方法: 1. 在 sql 语句中增加 order by,如 order by id asc 2. select 函数取数时,指定排序字段,如 ds1.select(name:-1),或者按照其他字段排序,如 ds1.select(EMPID, ,,;NAME:1) 按照 NAME 字段升序排序 3. 还可以按照某字段汇总后的结果进行排序,如:ds1.group(省份; 省份:1; ds1.sum( 工业产值):-1),对数据集 ds1 按照省份进行