问题分析:
很容易想到的,直接将数据存储在一个列表中,再对字符串按照字典序逆序排列,再将列表中的字符串连接起来,就能获得最大的整数。写出代码,发现不能通过。
仔细查看发现这样做是有问题的,例如321,32 。如果按照字符串字典序逆序排列,应该是321,32 。但很显然正确的排序应该是32,321 。这样拼出的数是更大的。
所以我们可以自定义一个比较函数,让序列按照拼出的数比较大的顺序排列。
拟定计划:
先用一个列表来存储数据
定义一个比较函数
通过这个比较函数对列表进行排序
#include<iostream> using namespace std; string s[30],temp; int i,j,suma; void msort(int n) //冒泡排序 { for(i=1; i<n; i++){ bool flag=true; for(j=1; j<=n-i; j++){ if(s[j]+s[j+1]<s[j+1]+s[j]){ //字符串拼接后较大在前 temp=s[j],s[j]=s[j+1],s[j+1]=temp; flag=false; } }if(flag) break; } } int main(){ int n; cin>>n; for(i=1; i<=n; i++){ //输入 cin>>s[i]; } msort(n); for(i=1; i<=n; i++){ //输出 cout<<s[i]; } return 0; }
(图片来源网络,侵删)
标签: NOIP