其他分享
首页 > 其他分享> > 这次做题明显比之前快了,哈哈哈哈呵呵哈哈哈或晕或或或或或或或(还是洛谷的)

这次做题明显比之前快了,哈哈哈哈呵呵哈哈哈或晕或或或或或或或(还是洛谷的)

作者:互联网

题目链接:  

    https://www.luogu.com.cn/problem/P1012

题目大意:

  

题目描述

设有 nnn 个正整数 a1…ana_1 \dots a_na1​…an​,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 nnn。

第二行有 nnn 个整数,表示给出的 nnn 个整数 aia_iai​。

输出格式

一个正整数,表示最大的整数

输入输出样例

输入 #1
3
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 }

基于本人能力问题,代码目前还不能精简,希望理解,如果感觉不错,请分享加点赞关注,有什么值得改进的地方也欢迎私信告知我;

 

标签:Node,nnn,哈哈哈哈,string,int,a1,leq,洛谷,哈哈哈
来源: https://www.cnblogs.com/like723/p/16091363.html