|
下面是一个求逆序数排序的程序。
目的是解一道题题目为
http://acm.pku.edu.cn/JudgeOnline/problem?id=1007
程序如下- #include <iostream>
- #include <vector>
- #include <string>
- class DNA{
- public:
- int get_input();
- int get_rank();
- int sort_rank ( );
- private:
- std::vector<std::string> m_dna_list;
- int get_order(char a);
- std::vector< std::pair< int,int> > m_rank;
- };
- int DNA::get_order(char a)
- {
- switch(a) {
- case 'A':
- return 0;
- case 'C':
- return 1;
- case 'G':
- return 2;
- case 'T':
- return 3;
- }
- return -1;
- }
- int DNA::get_input ( )
- {
- int n;
- std::string input_string;
- std::cin >> n;
- for (int i=0;i<n;i++) {
- std::cin >> input_string;
- m_dna_list.push_back(input_string);
- }
- return 0;
- }
- int DNA::sort_rank()
- {
- //?????????
- }
- int DNA::get_rank ( )
- {
- int p[4];
- int fake_char;
- int rank[4];
- int word_occur;
- std::vector<std::string>::size_type n;
- n = m_dna_list.size();
- for (std::vector<std::string>::size_type i=0;i<n;i++) {
- std::string &pstring = (m_dna_list[i]);
- rank[0]=rank[1]=rank[2]=rank[3]=0;p[0]=p[1]=p[2]=p[3]=0;
- for (int j=1;j<4;j++) {
- word_occur = 0;
- for (std::string::size_type k = pstring.size(); k > 0 ; k--) {
- if (get_order(pstring[k-1]) == j) {
- rank[j] += p[j];
- p[j]=rank[j]; //update rank
- word_occur = 1;
- }else if (get_order(pstring[k-1]) < j)
- rank[j]++;
- }
- if (word_occur == 0) rank[j] = 0;
- }
- m_rank.push_back( std::pair<int,int>(i,p[0]+p[1]+p[2]+p[3]) );
- }
- return 0;
- }
- int main( )
- {
- DNA dna;
- dna.get_input();
- dna.get_rank();
- dna.sort_rank();
- return 0;
- }
复制代码 问题1:
for (std::string::size_type k = pstring.size(); k > 0 ; k--) {
好恶心得用法阿,我明明知道 k 为 size_t
问题2: 如何排序
std::vector< std::pair< int,int> > m_rank;
pair 中的第一项为一个数值,第二项为对应string vector的下标要以第一项排序,主要想利用范型算法
例如:
pair<int,int>(5,1)
pair<int,int>(6,2)
pair<int,int>(3,3)
===>
pair<int,int>(3,3)
pair<int,int>(5,1)
pair<int,int>(6,2)
问题3: C++容器怎么这么恶心啊 |
|