昨天去做志愿服务去了没写成Q_Q
今天再来一道
先放题面描述
设有n个正整数(n<=20),将它们联成一排,组成一个最大的多位数
设有n个正整数(n<=20),将它们联成一排,组成一个最大的多位数。 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4,246联接成的最大整数为7424613
程序输入:n 以及n个数
程序输出:n个数联接成的多位数。
样例输入: 4
7 13 4 246
样例输出:7424613
做了这个题突然感觉所有题目的样例都十分的水
想到字符串从大到小排序输出有没有?
然而这个题正解并不是这样(一个点也过不了)
举个栗子
321和32哪个应该排在前面??
显然32应该排在前面所以不能用字典序排序
然而我们可以换一种排序方法
简而言之就是枚举哪个串放在前面的字典序最大(因为32132和32321位数一样)
上代码
#include<iostream> #include<algorithm> using namespace std; string a[150]; int n; bool flag1; bool cmp(string,string); int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>a[i];//数据太小cin就能过 if(a[i]!="0")flag1=1;//处理全都是0的情况,避免输出一大堆0(然鹅好像并没有这种数据) } sort(a+1,a+n+1,cmp); if(!flag1)putchar(‘0‘); else for(int i=1;i<=n;i++)cout<<a[i]; return 0; } bool cmp(string a,string b) { return a+b>b+a;//这里是重点!! //连接两个字符串后得到的两个新串明显位数一样,所以可以直接比较字典序 //注意大的在前!! }
满满是坑的一道题啊
大家以后一定想好再写
原文地址:https://www.cnblogs.com/qxds/p/9502242.html
时间: 2024-10-30 18:00:07