DNA Sorting
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 77545 | Accepted: 31097 |
Description
One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
Sample Output
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
Source
East Central North America 1998
解题报告
这是一题有关排序的水题,DNA排序,用逆序数来描述一个DNA的混乱程度。按逆序数排序。。。
#include<stdio.h>
#include<string.h>
struct strstr
{
char str[1000];
int num;
int ss;
}s[1000];
int main ()
{
char c[100];
int i,j,k,n,m,t;
memset(s,0,sizeof(s));
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%s",s[i].str);
s[i].ss=i;
for(j=0;j<n;j++)
{
for(k=j+1;k<n;k++)
{
if(s[i].str[j]>s[i].str[k])
s[i].num++;
}
}
}
for(i=0;i<m-1;i++)
{
for(j=i+1;j<m;j++)
{
if(s[i].num>s[j].num)
{
t=s[i].num;
s[i].num=s[j].num;
s[j].num=t;
strcpy(c,s[i].str);
strcpy(s[i].str,s[j].str);
strcpy(s[j].str,c);
}
else if(s[i].num==s[j].num&&s[i].ss>s[j].ss)
{
t=s[i].num;
s[i].num=s[j].num;
s[j].num=t;
strcpy(c,s[i].str);
strcpy(s[i].str,s[j].str);
strcpy(s[j].str,c);
}
}
}
for(i=0;i<m;i++)
puts(s[i].str);
return 0;
}
#include<stdio.h>
#define INF 0xffffff//最大值
#include<string.h>
char str[200][200];
int value[200];
int main ()
{
int n,m,l,p;
memset(value,0,sizeof(value));
value[0]=INF;
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%s",str[i]);
for(int j=0;j<m;j++)
for(int k=j+1;k<m;k++)
if(str[i][j]>str[i][k])
value[i]++;
}
p=0;
for(int i=1;i<=n;i++)//按逆序数排序,使用选择排序,同时并输出
{
for(int j=1;j<=n;j++)
{
if(value[j]<value[p])
p=j;
}
printf("%s\n",str[p]);
value[p]=INF;
}
return 0;
}
另附选择排序的手打代码。
void Select_Sort(int arr[],int n)
{
int temp,min;
for(int i=0;i<n-1;i++)
{
min=i;
for(int j=i+1;j<n;j++)
{
if(arr[min]>arr[j])
min=j;
}
if(min!=i)
{
temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
return ;
}
#define swap(x,y,t) ((t) = (x),(x) = (y),(y) = (t))//使用宏定义方式
void selectSort(int arr[],int n)
{
int i,j,min,temp;
for(i = 0; i < n - 1; i++)
{
min = i;
for(j = i + 1; j < n; j++)
if(arr[min] > arr[j])
min = j;
swap(arr[i],arr[min],temp);
}
}