POJ 1007

这道题题目意思很好理解,就是求每个序列的measure值,怎么求?就是按题目的意思,将字符串里面的每个字母依次与后面的进行比较,遇到比它小的,count++

最后输出就是一个排序,将count里面的值排序,同时要将它们的序号存进另一个数组b,毕竟最后有用的是 字符串对应的下标

找到一个 最小值之后,将它的下标保存,然后将它的值赋为MAX,一个很大的数,保证下一次一定不会选上就行。

这题虽然不难,但还是花了我好长时间,总是提示 Runtime,后来发现原来是用了 string 类造成的,换成char型的二维数组就可以了,但是我想它们之间的时间效率会差多少呢?

我估计是 调用类函数 产生的时间开销

#include<iostream>
#include<string>
#define MAX 1<<30
using namespace std;

int main(){
    int n,m;
    cin>>n>>m;
    char str[101][51];
    int count[100];   //记录每个字符串的measure
    memset(count,0,sizeof(count));
    for(int i=0;i<m;i++){
        cin>>str[i];
        for(int j=0;j<n-1;j++){
            for(int k=j+1;k<n;k++){
                if(str[i][j]>str[i][k])
                    count[i]++;
            }
        }
    }
    int b[101];
    for(int i=0;i<m;i++){
        b[i] = 0;
        int temp = count[0];
        for(int j=1;j<m;j++){
            if(count[j]<temp){
                temp = count[j];
                b[i] = j;
            }
        }
        count[b[i]] = MAX;
    }
    
    for(int i=0;i<m;i++){
        cout<<str[b[i]]<<endl;
    }
    return 0;
}

这里再提供一种 另一种比较优化的解法,就是利用 struct结构,将每个字符串与其对应对value值 绑在一块儿,这样似乎效果更好一些。

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

struct DNA{
    string str;
    int value;
};

int cmp(const void *a,const void *b){
    return (*(DNA *)a).value > (*(DNA *)b).value? 1:-1;
}

int main(){
    int n,m;
    cin>>n>>m;
    DNA dna[101];
    for(int i=0;i<m;i++){
        cin>>dna[i].str;
        dna[i].value = 0;
        for(int j=0;j<n-1;j++){
            for(int k=j+1;k<n;k++){
                if(dna[i].str[j]>dna[i].str[k])
                    dna[i].value++;
            }
        }
    }
    qsort(dna,m,sizeof(DNA),cmp);
    for(int i=0;i<m;i++){
        cout<<dna[i].str<<endl;
    }
    return 0;
}

这里关键是 快排算法qsort,对于结构体的排序,根据其中的某一个变量大小为依据,这种写法需要多熟悉


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值