POJ_1007:DNA Sorting解题报告

【大致题意】排列多个DNA序列,按照每个序列的“有序程度”。如果一个序列已经按照字母顺序排好了,那么这个序列有序程度最高,如AACCGGTT。反之,如果一个序列越无序,那么它的有序程度越低,如TGTCAA。

【解题思路】计算每个序列的“逆序数”,即反序字母对的个数,如ATGC的逆序数是3,因为TG,TC,GC都是逆序的。然后按照每个序列的逆序数排序,逆序数越大说明这个序列越无序。

#include <iostream>
#include <algorithm>
using namespace std;

const int SIZEN = 51;
const int SIZEM = 101;

struct S{
	char sequence[SIZEN];
	int unsortedness;
} DNA[SIZEM];

int n, m;
int cnt[4];	//保存当前字母'A''C''G''T'的个数
enum {LETTERA, LETTERC, LETTERG, LETTERT};

bool cmp(S a, S b) {
	return a.unsortedness < b.unsortedness;
}

int main() {
	int i, j;
	while (cin >> n >> m) {
		cin.get();
		for (i = 0; i < m; i++) {
			cin.getline(DNA[i].sequence, SIZEN);
		}

		for (i = 0; i < m; i++) {
			memset(cnt, 0, sizeof(cnt));
			for (j = 0; j < n; j++) {
				if (DNA[i].sequence[j] == 'A') {
					cnt[LETTERA]++;
					DNA[i].unsortedness += cnt[LETTERC];
					DNA[i].unsortedness += cnt[LETTERG];
					DNA[i].unsortedness += cnt[LETTERT];
				} else if (DNA[i].sequence[j] == 'C') {
					cnt[LETTERC]++;
					DNA[i].unsortedness += cnt[LETTERG];
					DNA[i].unsortedness += cnt[LETTERT];
				} else if (DNA[i].sequence[j] =='G') {
					cnt[LETTERG]++;
					DNA[i].unsortedness += cnt[LETTERT];
				} else {
					cnt[LETTERT]++;
				}
			}
		}

		stable_sort(DNA, DNA+m, cmp);

		for (i = 0; i < m; i++) {
			cout << DNA[i].sequence << endl;
		}
	}

	return 0;
}

【代码说明】定义了一个结构体数组来保存输入的多个DNA序列,并且每个序列对应一个整型值unsortedness来保存其逆序数,然后按照逆序数排序。

【个人体会】只是由于太久没有编程,生疏了,卡在了两个语法上。

其一是字符串的读取,C和C++有一系列的字符串读取方法,很难记住他们之间的区别,而我又一直纠结于代码写成C风格的还是C++风格的,不情愿两者混乱在一起,强迫症地逼自己尽量用C++的库函数(这使我吃了不少苦头啊)。

这道题虽然花了很长的时间,但是还是有收获的,最起码知道怎样读取一行字符串了(包括空格),既然我习惯用cin和cout,那么为保持一致,我使用cin的成员函数get和getline来读取单个字符和一行字符。需要注意的是,cin>>n之后如果使用cin.getline(),千万记住须先用cin.get()把cin>>n留在输入流中的换行符读掉,不然的话cin.getline()直接就读到了cin>>n遗留的换行符,而导致我们想要的读取的字符串没被读取。

其二是sort()函数的调用,起初我是这样 stable_sort(DNA[0], DNA[m], cmp); 调用的,结果编译出现错误,还以为是结构体或是比较函数写得有问题,查了好久,差点把数组改成了vector,因为看到API上是用迭代器作为参数的,后来改成 stable_sort(DNA, DNA+m,
cmp); 竟然可以了。

POJ_1007:DNA Sorting解题报告

时间: 2024-10-09 00:36:49

POJ_1007:DNA Sorting解题报告的相关文章

【LeetCode】Repeated DNA Sequences 解题报告

[题目] All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a function to find all the 10-letter-lon

poj 1094 Sorting It All Out 解题报告

题目链接:http://poj.org/problem?id=1094 题目意思:给出 n 个待排序的字母 和 m 种关系,问需要读到第 几 行可以确定这些字母的排列顺序或者有矛盾的地方,又或者虽然具体的字母顺序不能确定但至少不矛盾.这些关系均是这样的一种形式: 字母1 < 字母2 这道题目属于图论上的拓扑排序,由于要知道读入第几行可以确定具体的顺序,所以每次读入都需要进行拓扑排序来检验,这时每个点的入度就需要存储起来,所以就有了代码中memcpy 的使用了. 拓扑排序的思路很容易理解,但写起来

USACO Section2.1 Sorting a Three-Valued Sequence 解题报告

sort3解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 给你N,而后给出N个数,每个数都是1~3中的一个.请问,要把这个数列升序排好,最少需要进行几次两两交换?[数据范围] 1<=N<

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的

ACdream 1203 - KIDx&#39;s Triangle(解题报告)

KIDx's Triangle Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description One day, KIDx solved a math problem for middle students in seconds! And than he created this problem. N