题解:牛客网16783——拼数

原题链接: https://ac.nowcoder.com/acm/problem/16783

题目简述:

给你NN个数,用它们拼成一个数,使得拼成的数最大。

思路及代码:

例如:1331234313,312,343拼成的数就是:3433121334331213
简单无脑:

#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b) {
    return a>b;
}
int main() {
    int a;
    cin>>a;
    int n[1010101];
    for(int i = 0;i<a;++i) {
        cin>>n[i];
    }
    sort(n,n+a,cmp);
    for(int i = 0;i<a;++i) {
        cout<<n[i];
    }
}

可是你会发现,这不行!因为这组数据:
44个整数71342467,13,4,246联接成的最大整数为:74246137424613

上面这个代码在比较7和246时出现了问题。

这时就要用到字符串。

字符串是C++的特色,具有如下特点:

  1. 转换方便,提供转换函数to_string()
  2. 操作简单易学
  3. 常用操作里面都有封装好了的函数,不用你自己求,例如substr(),length()等等。

就有了如下代码:

#include <bits/stdc++.h>
using namespace std;
bool cmp(string a,string b) {
    return a+b>b+a;
}
int main() {
    int a;
    cin>>a;
    string n[1010101];
    for(int i = 0;i<a;++i) {
        cin>>n[i];
    }
    sort(n,n+a,cmp);
    for(int i = 0;i<a;++i) {
        cout<<n[i];
    }
}

为什么上面cmp可以这样写,因为对字符串使用+号计算机会将这两个字符串拼接起来,而不是真正意义上的加法(这点与int float等不同)

于是针对上面那组数据,这个cmp其实是在将72462467比较大小。

OK
在这里插入图片描述
做完了.

posted @ 2019-08-25 11:01  littlefrog  阅读(186)  评论(0编辑  收藏  举报