您的位置:首页 > 其它

POJ 1007

2016-03-07 19:56 357 查看
这道题题目意思很好理解,就是求每个序列的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,对于结构体的排序,根据其中的某一个变量大小为依据,这种写法需要多熟悉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: