• ACM1007


    题目:DNA序列排序

    DNA序列由一序列的大写英文字母表示,如ABCDEF。紊乱程度表示组成DNA序列的字母按照由小到大的顺序进行排列程度,如ABC的紊乱程度比ACB小,因为它字母都是由小到大排序的。紊乱程度计算如下,以DNA序列DCEFB为例:DCEFB的紊乱程度为5,其中字母D右边的序列有2个小于它的字母C和B,字母C有1个小于它的字母B,同理,字母E和F分别有1个排序小于它的字母,紊乱程度=2+1+1+1=5。紊乱程度越大,排序越乱。

    程序输入:

    第1行输入m和n,其中m表示每一个DNA序列的长度,n表示一共有多少个DNA序列;第2到n行输入DNA序列,每一个DNA序列的长度都为m。m的取值范围为1-100,即DNA序列的长度不超过100,n的范围为1-50,表示最多有50个DNA序列。

    结果输出:

    按照DNA的紊乱程度由小到大进行排序,如果两个DNA序列的紊乱程度相同,则按照输入的顺序进行排序。

    程序设计—(时间16ms,占用空间200k):

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 void qsort(int startIndex,int EndIndex,int *vector,string *values){
     7     int start=startIndex;
     8     int end=EndIndex;
     9     int currentValue = *(vector+start);
    10     string currentStr = *(values+start);
    11     while(start<end){
    12         while(start<end&&*(vector+end)>=currentValue){
    13             end--;
    14         }
    15         *(vector+start)=*(vector+end);
    16         *(values+start)=*(values+end);
    17         while(start<end&&*(vector+start)<=currentValue){
    18             start++;
    19         }
    20         *(vector+end)=*(vector+start);
    21         *(values+end)=*(values+start);
    22     }
    23     *(vector+end)=currentValue;
    24     *(values+end)=currentStr;
    25     if(end-1>startIndex){
    26         qsort(startIndex,end-1,vector,values);
    27     }
    28     if(end+1<EndIndex)
    29     {
    30         qsort(end+1,EndIndex,vector,values);
    31     }
    32 }
    33 
    34 int main()
    35 {
    36     char line[30];
    37     string str;
    38     int *numOfLines=new int[0];
    39     int index=0;
    40     int *values=new int[0];
    41     string *allStr=new string();
    42     int totalLine=1;
    43     int leterNum=0;
    44     cin>>leterNum>>totalLine;
    45     numOfLines = new int[totalLine];
    46     allStr = new string[totalLine];
    47     values = new int[leterNum];
    48     while (index<totalLine)
    49     {
    50         cin>>line;
    51         str = line;
    52         *(allStr+index)=line;
    53         int count=0;
    54         for(int i=0;i<leterNum;i++){
    55             int l = line[i]-'A';
    56             *(values+i)=l;
    57             for(int j=i-1;j>=0;j--){
    58                 if(*(values+j)>*(values+i)){
    59                     count++;
    60                 }
    61             }
    62         }
    63         (*(numOfLines+index))=count;
    64         index++;
    65     }
    66     qsort(0,totalLine-1,numOfLines,allStr);
    67     for(int i=0;i<totalLine;i++){
    68         cout<<*(allStr+i)<<endl;
    69     }
    70     return 0;
    71 }

    1007是简单题,主要考察一些小细节,有几个需要注意的地方:

    1)数组和指针的问题(由于本人刚刚接触C++,在指针上确实花了一些时间)

    数组的指针可以表示第一个元素的位置,然后通过++可以得到其他元素的指针。

    如:int *pointer = new int[10];

    新建一个10个元素的数组,pointer指向该数组第一个元素的地址,pointer++表示数组第二个元素的地址,pointer+i表示数组第pointer+i个元素。

    2)第二个是输入的问题

    弄清楚几个输入的关键方法:

    >>、getLine、gets、get_s、fget

  • 相关阅读:
    POJ3480 John 博弈论 anti-nim anti-SG
    POJ2068 Nim 博弈论 dp
    POJ 1740 A New Stone Game 又是博弈论配对找规律orz 博弈论 规律
    Python复习之下划线的含义
    django 模板语法和三种返回方式
    Python自动化之一对多
    Python自动化之django的ORM
    Python自动化之django的ORM操作——Python源码
    django orm字段和参数
    Python自动化之django视图
  • 原文地址:https://www.cnblogs.com/yonghao/p/5002658.html
Copyright © 2020-2023  润新知