PATA1038题解(需复习)

Posted dcklm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PATA1038题解(需复习)相关的知识,希望对你有一定的参考价值。

技术图片
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
struct str{
    char s[16];
    int index;
};
bool cmp(str a,str b) {
    int len1 = strlen(a.s);
    int len2 = strlen(b.s);
    if(len1 == 0 || len2 == 0) return false;
    int k = 0;
    while(k < len1 && k < len2) {
        if(a.s[k] != b.s[k]) {
            return a.s[k] < b.s[k];
        }
        k++;
    }
    if(len1 == len2) return true;
    int temp = 0;
    while(k < len1) {
        if(b.s[temp % len2] != a.s[k]) {
            return a.s[k] < b.s[temp % len2];
        }
        temp++; k++;
    }
    while(k < len2) {
        if(b.s[k] != a.s[temp % len1]) {
            return a.s[temp % len1] < b.s[k];
        }
        temp++; k++;
    }
    return len1 > len2;
    
}
bool test(char * a, char *b) {
    
    if(strlen(a) == 0) {
        if(b[0] == 0 && strlen(b) == 1) return false;
        if(b[0] == 0) {
            strcpy(a,b+1);
        }else {
            strcpy(a,b);
        }
        return true;
    }else {
        str a_temp, b_temp;
        strcpy(a_temp.s,a);
        strcpy(b_temp.s,b); 
        if(a[0] == 0) {
            strcpy(a_temp.s,a+1);
        }if(b[0] == 0) {
            strcpy(b_temp.s,b+1); 
        }
        if(cmp(b_temp,a_temp)) {
            strcpy(a, b_temp.s);
            return true;
        }
        return false;
    }
} 
int main() {
  vector<str>vec, vec_non_zero;
  int n, _min = 1e9, index;
  str temp;
  char ch[16]; ch[0] = ;
  cin >> n;
  for(int i = 0; i < n; i++) {
        cin >> temp.s;
        temp.index = i;
        vec.push_back(temp);
        if(test(ch,temp.s)) {
            index = i;
        }
  }
  sort(vec.begin(), vec.end(), cmp);
  cout << ch;
  for(int i = 0; i < vec.size(); i++) {
       if(vec[i].index == index) continue;
       cout << vec[i].s;
  }
}
View Code

上述为错误代码。 错误原因 同 https://blog.csdn.net/xyt8023y/article/details/46473243 一样

 

技术图片
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
vector<string> temp;
bool cmp(string a, string b) {
    return a+b < b+a;
} 
int main() {
  int num, i;
  string str, tes;
  cin >> num;
  for(i = 0; i < num;i++) {
          cin >> str;
          temp.push_back(str);
  }
  sort(temp.begin(), temp.end(), cmp);
  for(int i = 0; i <num;i++) {
      tes += temp[i];
  }
  i = 0;
  while(i < tes.length() && tes[i] == 0) i++;
  if(i == tes.length()) printf("0");
  else {
      for(; i<tes.length(); i++) {
          cout << tes[i];
      }
  }
}
View Code

上述为正确代码。 //https://blog.csdn.net/sinat_29278271/article/details/48047877

 

总结:cmp 排序 也可以考虑组合情况 ,这样就不需要考虑每一位的情况

以上是关于PATA1038题解(需复习)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1038题解

PATA1036题解

PATA1037题解

PATA1002题解

PATA1041题解

PATA1048题解