1. 程式人生 > >悲催的 1007:DNA排序

悲催的 1007: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行:每行是一個長度為n的字串

輸出

按逆序對數從少到多輸出字串,逆序對數一樣多的字串按照輸入的順序輸出。

樣例輸入

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

樣例輸出

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA

噫籲嚱,危乎高哉。這不是一道難題,可我就卻卡住了半個多小時,中間看這WA一度懷疑人生,這個題簡直一眼就可以看透,那麼錯在哪裡了?我看了其他的解法,洋洋灑灑幾百行,可能是為了展現不同的方法都可以去解這道題吧。可我依然不得其解。最終我找來了OJ系統的測試資料,終於知道哪裡錯了。先貼上程式碼。

#include <iostream>
#include<string>
using namespace std;
int judge(string a)
{
    int p=0;
    for(int i=0;i<a.length();i++)
    {
        for(int j=i+1;j<a.length();j++)
        {
            if(a[i]>a[j])
                p++;
        }
    }
    return p;
}
int main()
{
    int n,m;
    cin>>n>>m;
    int num[110]={0};
    string store[110];
    for(int i=0;i<m;i++)
    {
       cin>>store[i];
       num[i]=judge(store[i]);
    }
    for(int i=0;i<1000;i++)//重點在這裡,我之前寫的是110,心裡想的是,最多50個字元,我傳一百多簡直超了,直到我看了測試資料,這個i都能到好幾百了。於是調大點,就過了。
    {
        for(int j=0;j<m;j++)
        {
            if(num[j]==i)
            {
                cout<<store[j]<<endl;
            }
        }
    }
    return 0;
}

從此以後,我要永遠的相信機器,畢竟機器從來不會犯錯,再也不想當然了。