Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >POJ 1007 DNA排序解题

POJ 1007 DNA排序解题

作者头像
Michael阿明
发布于 2021-02-20 02:21:15
发布于 2021-02-20 02:21:15
3520
举报

题目链接 http://poj.org/problem?id=1007 C++代码实现

代码语言:javascript
AI代码解释
复制
#include<string>
#include<iostream>
using namespace std;
struct DNAdata	//定义结构体
{
    char name[51];
    double sum;
    DNAdata()
    {
        sum = 0;
    }
};
void swapDNA(DNAdata *a, DNAdata *b)
{
    DNAdata tempDNA;
    tempDNA = *a;
    *a = *b;
    *b = tempDNA;
}
int main()
{
    size_t n, m;	//dna序列位数n,m个dna序列
    cin >> n >> m;
    DNAdata dna[101];
    char temp;
    size_t i,j,k;
    for(i = 0; i != m; ++i)
    {
        for(j = 0; j != n; ++j) //输入1个dna的字符序列
        {
            cin >> dna[i].name[j];
        }
        for(j = 0; j != n; ++j) //对该序列进行求逆序数
        {
            temp = dna[i].name[j];
            for(k = j+1; k != n; ++k)
            {
                if(temp>dna[i].name[k])
                {
                    ++dna[i].sum;
                }
            }
        }
    }
    for (i = 0; i != m; ++i)  //插入排序
    {
        for (j = i; j > 0 && dna[j-1].sum > dna[j].sum; --j)
            //每次的子列都是有序的,判断条件可写在for(内),否则不可(这么做减少运行次数)
            //每次和有序数组最后一个比较,向前搜索,直到找到位置停止
        {
            swapDNA(&dna[j-1], &dna[j]);
        }
    }
    for (i = 0; i != m; ++i)  //输出排序后的dna序列
    {
        for(j = 0; j != n; ++j)
        {
            cout << dna[i].name[j];
        }
        cout << endl;
    }
    return 0;
}

方法2

代码语言:javascript
AI代码解释
复制
#include<string>
#include<iostream>
using namespace std;
struct DNAdata	//定义结构体
{
    char name[51];
    double sum;
    DNAdata()
    {
        sum = 0;
    }
};
void swapDNA(DNAdata *a, DNAdata *b)
{
    DNAdata tempDNA;
    tempDNA = *a;
    *a = *b;
    *b = tempDNA;
}
int main()
{
    size_t n, m;	//dna序列位数n,m个dna序列
    cin >> n >> m;
    DNAdata dna[101];
    char temp;
    size_t i,j,k;
    size_t A = 0, C = 0, G = 0;
    for(i = 0; i != m; ++i)
    {
        for(j = 0; j != n; ++j) //输入1个dna的字符序列
        {
            cin >> dna[i].name[j];
        }
        for(int j = n-1; j >= 0; --j)	//从后往前计算逆序数
        {
            switch(dna[i].name[j])
            {
                case 'A':
                    ++A;break;
                case 'C':
                    ++C;dna[i].sum += A;break;
                case 'G':
                    ++G;dna[i].sum += A + C;break;
                case 'T':
                    dna[i].sum += A + C + G;break;
                default:
                    break;
            }
        }
        A = 0;	//为下一个计算,清零
        C = 0;
        G = 0;
    }

    for (i = 0; i != m; ++i)	//插入排序
    {
        for (j = i; j > 0 && dna[j-1].sum > dna[j].sum; --j)
            //每次的子列都是有序的,判断条件可写在for(内),否则不可(这么做减少运行次数)
            //每次和有序数组最后一个比较,向前搜索,直到找到位置停止
        {
            swapDNA(&dna[j-1], &dna[j]);
        }
    }

    for (i = 0; i != m; ++i)  //输出排序后的dna序列
    {
        for(j = 0; j != n; ++j)
        {
            cout << dna[i].name[j];
        }
        cout << endl;
        //cout << " " << dna[i].sum << endl;
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/08/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PAT乙级真题 / 知识点(1)
起初,报PAT是伙伴推荐。但在报名路途中,有朋友说,花时间到这上面不值得,还有学长说没听过,野鸡杯。
十二.
2025/10/22
800
PAT乙级真题(2014·冬)
1033、旧键盘打字-(解析)-输入格式!这才是重点(┬┬﹏┬┬),让我多瞧了20分钟
十二.
2025/10/22
1350
poj-1007-DNA Sorting
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.
瑾诺学长
2018/09/21
6180
八大经典排序算法总结
终于到了排序部分了。这部分也是最难总结的,毕竟不同的排序算法思想多少会有差别,有些甚至完全不一样。今天不知道要码多少字。好吧,先为我的手指默哀三分钟~
指点
2019/01/18
5560
八大经典排序算法总结
POJ 1804 逆序数 解题(归并排序)
文章目录 解法1:直接双重循环求解,n*n复杂度 解法2:采用归并排序求解,复杂度nlgn 题目链接 http://poj.org/problem?id=1804 题目大意: 让一串无
Michael阿明
2021/02/20
4940
POJ 1804 逆序数 解题(归并排序)
❤️十大排序算法详解❤️——可能是你看过最全的,完整版代码
兄弟们,应上篇数据结构的各位要求,今天我开始工作了,开始肝算法,剑指offer还在路上,我真想开车去接它,奈何码神没有驾照的开车,算了,弄排序算法吧,有点长,耐心看啊,原创不易,你们懂的,先上一张图
秋名山码神
2022/12/13
4250
❤️十大排序算法详解❤️——可能是你看过最全的,完整版代码
归并排序详解 和逆序数计算
本文通过介绍归并排序算法的原理和实现过程,总结了归并排序在处理大数据集时效率高、稳定性和正确性好的特点。同时,也分析了归并排序在实际应用中可能遇到的问题,如逆序数计算和合并过程中的操作数(元素)比较次数。通过使用归并排序算法,可以在处理大规模数据时获得高性能。
Kindear
2017/12/29
1.4K0
CF1591D「Yet Another Sorting Problem」
题目链接:CF1591D「Yet Another Sorting Problem」。
hotarugali
2022/03/18
2840
水题第二弹题解
改过的标题很具有迷惑性哦! A POJ3414本次代码量最大的一题,思想是搜索,详细解题报告,请见点击打开链接 B巨水,不要被题目迷惑了,连通图的性质最少需要(n-1)条边,所以可删 m-n+1条。 #include<iostream> #include<cstdio> using namespace std; int main() { int n,m; cin>>n>>m; for(int i=0;i<m;i++) { int a,b; sc
triplebee
2018/01/12
7360
模拟算法题练习(二)(DNA序列修正、无尽的石头)
问题描述 在生物学中,DNA序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 DNA序列,每条序列由 A、C、G、T 四种字符组成,长度相同。但是现在我们记录的 DNA序列存在错误,为了严格满足 DNA 序列的碱基互补配对即 A-T和C-G,我们需要依据第一条 DNA 序列对第二条 DNA 序列进行以下操作: 1.选择第二条 DNA 序列的任意两个位置,交换他们的字符, 2.选择第二条 DNA 序列任意一个位置,将其字符替换为 A、C、G、T 中的任何一个。 需要注意的是:每个位置上的碱基只能被操作一次! 你的任务是通过最小的操作次数,使第二条 DNA 序列和第一条DNA序列互补。并且已知初始两条 DNA 序列长度均为 N。 输入格式 第一行包含一个整数 N,(1 ≤ N ≤ 103),表示 DNA 序列的长度。 接下来的两行,每行包含一个长度为 N 的字符串,表示两条 DNA序列。 输出格式 输出一个整数,表示让第二条 DNA 序列和第一条 DNA 序列互补所需的最小操作次数。
走在努力路上的自己
2024/03/02
3210
模拟算法题练习(二)(DNA序列修正、无尽的石头)
归并排序求逆序数
君子终日乾乾,夕惕若厉,无咎。 归并排序求逆序数 练习题 poj1804 poj2299 HDU4911 /*归并排序求逆序数*/ /*我们知道mergesort是稳定排序,所以就可以根据这个特点来求序列的逆序数 在Merge()中,合并两个已经有序的数组A,B.因为A.B有序,所以,A,B各自的逆序数是0,所以AB的逆序数等于A,B之间的逆序数. */ #include<iostream> using namespace std; typedef long long ll; const ll N = 1
AngelNH
2020/04/16
5040
排序算法——一篇文章搞懂常用的排序算法
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 内部排序:数据元素全部放在内存中的排序。 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序
海盗船长
2020/08/27
4940
排序算法——一篇文章搞懂常用的排序算法
算法题目(四)
题目:我们把只包含因子2、3 和5 的数称作丑数(Ugly Number)。求从小到大的顺序的第1500个丑数。
Helloted
2022/06/06
4020
算法题目(四)
POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)
POJ 1003 题目链接 http://poj.org/problem?id=1003 大意:长度=1/2+1/3+…+1/n,给定长度值,求n #include<iostream> usi
Michael阿明
2021/02/20
2570
POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)
树状数组-从入门到拓展(转载非原创)
转载来源:https://www.cnblogs.com/AKing-/p/15311440.html
xlj
2021/09/20
5160
10种C++排序算法
题目:LeetCode 912. 排序数组(10种排序) 下面博文,为早期学习写的,很不简洁,请参考上面题目的版本。
Michael阿明
2021/02/20
1.2K0
noip2014普及组复赛试题_大一高数期末考试试题
考察计算机基础知识,所谓集成电路是将大量的晶体管和电子线路组合在一块硅片上,故又称为芯片。故选 A A A。
全栈程序员站长
2022/09/23
3600
noip2014普及组复赛试题_大一高数期末考试试题
【C++】 —— 笔试刷题day_8
本题,题目给定一个无序的数组arr,让我们返回其中最长连续序列的长度(要求数值连续,位置可以不连续)就例如3,5,6,4,只要数值是连续的自然数就可以。
星辰与你
2025/03/26
1080
【C++】 —— 笔试刷题day_8
基于链表实现的学生管理系统
定义一个包含学生信息(学号,姓名,性别,专业,语数外成绩,平均分,成绩排名)的链表,使其具有如下功能:
用户10604450
2024/03/15
2300
基于链表实现的学生管理系统
排序算法代码全实现
声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%b7%e9%9c%86%e6%88%98%e6%9c%ba-45/
对弈
2019/09/04
4730
排序算法代码全实现
相关推荐
PAT乙级真题 / 知识点(1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档