洛谷p1012拼数题解

Tips:大佬绕道不耽误您宝贵时间,以下仅分享了我在写题时的思路。

在第一眼看到这个题的时候,第一想法还是排序,不过显然此时不在应该按照整数排序而是按照字符串来进行排序然后按顺序输出。于是理所应当地写出下面这一段代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
const int N=30;
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    string arr[N];
    for(int i=0;i<n;i++) cin>>arr[i];
    sort(arr,arr+n);

//一开始不想写函数就让数组倒序输出了
    for(int i=n-1;i>=0;i--) cout<<arr[i];
    return 0;
 } 

提交后发现有一个样例没过,思索后发现如果比较的两个字符串长度不一样但是短字符串和长字符串对应的字符数字一样时发现了问题,例如121和12,理想情况下我们应该是想得到12312但是在字符串比较时会判定为121>12由此拼接的话会得到12112,显然这不是我们想要的结果,于是开始思考这种思路如何处理这种情况,第一思路再将长字符串数字比短字符串数字多的那些数字再和短字符串数字进行比较,但想了想发现这种思路很复杂,并且这不就是模拟吗,但由于本蒟蒻智商低下,一时间没想到两个字符串直接相加,之后坐那儿想了一会才想到直接字符串相加比较就是。

附上ac代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
const int N=30;
using namespace std;
bool cmp(string x,string y){
    return x+y<y+x;
}
int main()
{
    int n;
    scanf("%d",&n);
    string arr[N];
    for(int i=0;i<n;i++) cin>>arr[i];//这里如果用scanf会有错误 
    sort(arr,arr+n,cmp);
    for(int i=n-1;i>=0;i--) cout<<arr[i];
    return 0;
 } 

ac之后去看了题解,有的就是用这个解法,看还有人说贪心但由于本蒟蒻还没学到就不介绍了。

---------------------------------------------------------------------------------------------------------------------------------

这也是我第一次写题解,更多的还是写给自己看看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值