描述
现在有一些长度相等的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;
}
从此以后,我要永远的相信机器,毕竟机器从来不会犯错,再也不想当然了。 |