题目链接:
https://www.luogu.com.cn/problem/P1012
题目大意:
题目描述
设有 nnn 个正整数 a1…ana_1 \dots a_na1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 nnn。
第二行有 nnn 个整数,表示给出的 nnn 个整数 aia_iai。
输出格式
一个正整数,表示最大的整数
输入输出样例
输入 #13 13 312 343输出 #1
34331213输入 #2
4 7 13 4 246输出 #2
7424613
说明/提示
对于全部的测试点,保证 1≤n≤201 \leq n \leq 201≤n≤20,1≤ai≤1091 \leq a_i \leq 10^91≤ai≤109。】
不知道你们怎么想的,我的第一反应肯定是用字符串(string)去存放每个输入的
接下来就是一个小拓展了
1, 冒泡排序
1 for(int i=0;i<n-1;i++){ 2 for(int j=0;j<n-i-1;j++){ 3 //内容 4 } 5 }
基本的冒泡排序;如果不会的话,可以点击这里有最基本的冒泡排序讲解(详细)
然后你考没考虑过这种
a1="44412";
a2="444";
凭着朴素的情感肯定a2在a1前面会组成更大的数字
但是代码怎么实现,怎么精准的取出a1中“444”后面的“12”;
这时候就要引入一个知识点
string类中的substr方法
基本用法为取出字符串中的一段substr(起始坐标, 元素个数);
例如
1 string a="123456789"; 2 string t=a.substr(0,5); 3 cout<<t<<endl;//t=12345 4 string t2="12345"; 5 string t3=a.substr(t2.length()); 6 cout<<t3<<endl;//t3=6789
更多的用法等待你的发现
接下来就是AC代码展示了
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 struct Node{ 5 string a; 6 }; 7 int n; 8 Node s[30]; 9 bool cmp(Node a,Node b){ 10 return a.a>b.a; 11 } 12 int main(){ 13 cin>>n; 14 for(int i=0;i<n;i++){ 15 cin>>s[i].a; 16 } 17 sort(s,s+n,cmp); 18 if(s[0].a[0]=='0'){ 19 cout<<"0"<<endl; 20 system("pause"); 21 return 0; 22 } 23 for(int i=0;i<n-1;i++){ 24 for(int j=0;j<n-i-1;j++){ 25 int flag=0; 26 if(s[j].a.length()==s[j+1].a.length()){ 27 if(s[j].a<s[j+1].a){ 28 flag=1; 29 } 30 } 31 else{ 32 int ans=0; 33 string a,b; 34 //前 后 35 if(s[j].a.length()>s[j+1].a.length()){ 36 a=s[j].a; 37 b=s[j+1].a; 38 } 39 //后 前 40 else if(s[j].a.length()<s[j+1].a.length()){ 41 ans=1; 42 a=s[j+1].a; 43 b=s[j].a; 44 } 45 string t1=a.substr(0,b.length()); 46 if(t1>b){ 47 if(ans==1){ 48 flag=1; 49 } 50 } 51 else if(t1<b){ 52 if(ans==0){ 53 flag=1; 54 } 55 } 56 else if(t1==b){ 57 string t2=a.substr(b.length()); 58 if(t2>b){ 59 if(ans==1){ 60 flag=1; 61 } 62 } 63 else if(t2<b){ 64 if(ans==0){ 65 flag=1; 66 } 67 } 68 } 69 } 70 if(flag==1){ 71 // cout<<"交换"<<endl; 72 // cout<<s[j].a<<"\t"<<s[j+1].a<<endl; 73 string t=s[j].a; 74 s[j].a=s[j+1].a; 75 s[j+1].a=t; 76 } 77 } 78 } 79 for(int i=0;i<n;i++){ 80 cout<<s[i].a; 81 } 82 cout<<endl; 83 system("pause"); 84 return 0; 85 }
基于本人能力问题,代码目前还不能精简,希望理解,如果感觉不错,请分享加点赞关注,有什么值得改进的地方也欢迎私信告知我;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。