POJ 1007
2016-03-07 19:56
357 查看
这道题题目意思很好理解,就是求每个序列的measure值,怎么求?就是按题目的意思,将字符串里面的每个字母依次与后面的进行比较,遇到比它小的,count++
最后输出就是一个排序,将count里面的值排序,同时要将它们的序号存进另一个数组b,毕竟最后有用的是 字符串对应的下标
找到一个 最小值之后,将它的下标保存,然后将它的值赋为MAX,一个很大的数,保证下一次一定不会选上就行。
这题虽然不难,但还是花了我好长时间,总是提示 Runtime,后来发现原来是用了 string 类造成的,换成char型的二维数组就可以了,但是我想它们之间的时间效率会差多少呢?
我估计是 调用类函数 产生的时间开销
这里再提供一种 另一种比较优化的解法,就是利用 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,对于结构体的排序,根据其中的某一个变量大小为依据,这种写法需要多熟悉
最后输出就是一个排序,将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,对于结构体的排序,根据其中的某一个变量大小为依据,这种写法需要多熟悉
相关文章推荐
- 1036. Boys vs Girls (25)
- bootstrap小结
- 超炫黑客帝国字母雨效果
- arm看门狗的作用
- 《Java实战开发经典》第六章6.1
- error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- python小点心--获取汉子拼音首字母
- LeetCode : Valid Parentheses [java]
- qsort函数用法
- JsonCpp的使用方法
- Bitmap优化问题
- 进程间通信总结
- [RxJS] Reactive Programming - What is RxJS?
- Android Studio使用build.gradle引入github开源库
- 关于Math这个类的一些基本方法的案例实现
- MMO游戏设计三:架构设计
- 关于着色器LinearGradient的使用
- 关于着色器LinearGradient的使用
- 机器视觉VS计算机视觉
- 关于着色器LinearGradient的使用