华师一附中OI组
标题:
P1012 拼数
[打印本页]
作者:
admin
时间:
2018-4-19 11:09
标题:
P1012 拼数
https://www.luogu.org/problemnew/show/P1012
有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
输入格式:
第一行,一个正整数n。
第二行,n个正整数。
输出格式:
一个正整数,表示最大的整数
作者:
admin
时间:
2018-4-19 11:13
找到排序的方法,将大数字放在前面小数字放在后面接起来就行了,关键就是如何判断大小!
传统上的整数比较是位数多的大,这里显然不对比如 9 应该放在55 的前面
或者按字典序那样比较,但是也不对,比如98 应该放在9 的后面 34却要放在3的前面
找到这个比较的方法写好这个函数就是此题的关键 !!!
#include<iostream>
using namespace std;
const int mn=25;
int n,i,j;
string s[mn];
bool isbig(string s1,string s2)
{
if (s1==s2) return 1; ///相等特判
else
{
int i=0, b=0;
int l1=s1.size();
int l2=s2.size();
while (b==0) ///首尾相连循环比较!!!
{
if (s1[i%l1]>s2[i%l2]) b=1;
else if (s1[i%l1]<s2[i%l2]) b=-1;
else i++;
}
return (b>=0);
}
}
int main()
{
cin>>n;
for (i=0; i<=n-1; i++) cin>>s[i];
///排序,不讲究了
for (i=0; i<=n-2; i++)
for (j=i+1; j<=n-1; j++)
if (!isbig(s[i],s[j])) swap(s[i],s[j]);
for (i=0; i<=n-1; i++) cout<<s[i];
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-4-21 20:08
#include<iostream>
#include<algorithm>
using namespace std;
int n;
string s[30];
bool cmp(string x,string y)
{
string a=x+y,b=y+x;
return a>b;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>s[i];
sort(s+1,s+n+1,cmp);
for(int i=1;i<=n;i++)cout<<s[i];
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-4-21 20:25
#include<iostream>
using namespace std;
string s[25];
int i,j,n;
bool b(int a,int b)///判断哪个在前,哪个在后
{
int la=s[a].size(),lb=s[b].size();
string s1=s[a]+s[b],s2=s[b]+s[a];
for (int k=0; k<=la+lb-1; k++)
{
int x1=s1[k]-'0',x2=s2[k]-'0';
if (x1==x2) continue;
else if (x1<x2) return 0;
else return 1;
}
return 1;
}
int main()
{
cin>>n;
for (i=1; i<=n; i++) cin>>s[i];
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
if (b(i,j)) swap(s[i],s[j]);
}
for (i=1; i<=n; i++) cout<<s[i];
return 0;
}
复制代码
作者:
王令欧
时间:
2018-4-21 20:33
#include <stdio.h>
int main()
{
int n,t,gud=0,i,j;
int num[21],reco[21],geno[21],c[21]={0};
long long int ans=0;
scanf("%d",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&num[i]);
}
for(i=0;i<=n-1;i++)
{
reco[i]=num[i];
geno[i]=num[i];
while(reco[i]/10!=0)
{
reco[i]=reco[i]/10;
c[i]++;
}
c[i]++;
if(gud<c[i])
gud=c[i];
}
for(i=0;i<=n-1;i++)
for(j=c[i];j<=gud-1;j++)
geno[i]=geno[i]*10;
for(i=0;i<=n-1;i++)
for(j=i+1;j<=n-1;j++)
if(geno[i]>geno[j])
{
t=geno[i];
geno[i]=geno[j];
geno[j]=t;
t=num[i];
num[i]=num[j];
num[j]=t;
}
t=1;
for(i=0;i<=n-1;i++)
{
if(i!=0)
for(j=0;j<=c[i-1]-1;j++)
t=t*10;
ans=ans+num[i]*t;
}
printf("%d",ans);
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-29 23:57
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n;
string a[21];
bool cmp(string x,string y)
{
return x+y>y+x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
cout<<a[i];
return 0;
}
复制代码
作者:
universehyf
时间:
2018-9-2 00:31
字符串比较
#include<iostream>
#include<algorithm>
using namespace std;
string s[21];
int n,i;
bool mycomp(string x,string y)
{return x+y > y+x;}
int main()
{
cin>>n;
for(i=0; i<n; i++) cin>>s[i];
sort(s,s+n,mycomp);
for(i=0; i<n; i++) cout<<s[i];
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2