POJ1007 DNA Sorting 排序 C语言

题目:http://poj.org/problem?id=1007

题目大意:给出一段DNA序列,按照有序程度降低的顺序输出,也就是以逆序对数增加的顺序输出

思路:记录A、C、G、T出现的次数,每输入一个字符,它出现的个数加1;如果输入A,逆序数加上已出现的C、G、T个数,输入C,逆序数加上已出现的G、T个数,输入G,逆序数加上已出现的T个数,输入T,逆序数不增加。

这样当字符串输入结束,这个串的逆序数也已经求出了。按照逆序数从小到大重排字符串,再输出,就可以了。

提交情况: AC 1次

总结:做的也是比较纠结。拖了很久的一道题,今天一定是脑残了才想做这个。一直对字符串处理比较头痛,吸收换行符什么的,各种混乱,经常是在读入时就出现错误。这个题也是调了好久才过了用例。

AC code:

View Code
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <algorithm>
5 using namespace std;
6
7 #define MAXN 60
8 #define MAXP (100 + 10)
9
10 int cA, cC, cG, cT; //出现次数
11
12 typedef struct Dna {
13 char s[MAXN];
14 int num;
15 }dna;
16
17 dna link[MAXP];
18
19 int cmp(dna &a, dna &b) {
20 return a.num < b.num;
21 }
22
23 void Find(int i, char ch) {
24 if(ch == 'A') {
25 ++cA;
26 link[i].num += (cC + cG + cT);
27 }
28 if(ch == 'C') {
29 ++cC;
30 link[i].num += (cG + cT);
31 }
32 if(ch == 'G') {
33 ++cG;
34 link[i].num += cT;
35 }
36 if(ch == 'T')
37 ++cT;
38 }
39
40 void Insert(int len, int cases) {
41 int i, j;
42 char ch;
43 for(i = 1; i <= cases; i++) {
44 cA = 0; cC = 0; cG = 0; cT = 0;
45 for(j = 1; j <= len; j++) {
46 scanf("%c", &ch);
47 link[i].s[j] = ch;
48 //printf("%c", link[i].s[j]);
49 Find(i, ch);
50 }
51 getchar();
52 //for(j = 1; j <= len; j++)
53 // printf("%c", link[i].s[j]);
54 //printf("\n");
55 }
56 }
57
58 void Print(int len, int cases) {
59 int i, j;
60 for(i = 1; i <= cases; i++) {
61 for(j = 1; j <= len; j++)
62 printf("%c", link[i].s[j]);
63 printf("\n");
64 }
65 }
66
67 int main() {
68 int len, cases;
69 scanf("%d%d", &len, &cases);
70 getchar(); // 注意此处吸收换行符
71 Insert(len, cases);
72 sort(link + 1, link + cases + 1, cmp);
73 Print(len, cases);
74 return 0;
75 }
posted @ 2011-07-24 00:01  cloehui  阅读(742)  评论(0编辑  收藏  举报