1. 程式人生 > >洛谷 - P1012 - 拼數 - 排序

洛谷 - P1012 - 拼數 - 排序

bug != col sin 應該 lse def 數據 max

https://www.luogu.org/problemnew/show/P1012

這道水題居然翻車了,還發現不了bug,服氣了。並不是空字符一定比不空要好,要取決於替代它的字符的大小。所以還是直接比較兩個字符串互相接後面的長短就好了。

錯誤代碼如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long

string s[20];
int n;

struct cmp{
    bool operator()(string s1,string s2){
        int n1=s1.length();
        
int n2=s2.length(); int ml=max(s1.length(),s2.length()); for(int i=0;i<ml;i++){ if(i<n1&&i<n2&&s1[i]!=s2[i]) return s1[i]>s2[i]; else{ if(i==n1) return 1; else if(i==n2)
return 0; } } return 0; } }; int main(){ cin>>n; for(int i=0;i<n;i++) cin>>s[i]; sort(s,s+n,cmp()); string ans; for(int i=0;i<n;i++) ans+=s[i]; cout<<ans<<endl; }

翻車的數據還是很簡單的:

6
321 32 407 135 13 217

好吧,正確的寫法應該是:

#include<bits/stdc++.h>
using namespace std;
#define ll long long

string s[20];
int n;

struct cmp{
    bool operator()(string s1,string s2){
        return s1+s2>s2+s1;
    }
};

int main(){
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>s[i];
    sort(s,s+n,cmp());
    string ans;
    for(int i=0;i<n;i++)
        ans+=s[i];
    cout<<ans<<endl;
}

洛谷 - P1012 - 拼數 - 排序