NOIP1998提高组
这题比较水
我们知道,高位数字对一个数的大小影响更大,所以我们要尽可能使放在前面的数位上的数字更大,比如343和313,4比1大,所以我们会把343放在前面
所以我们只需要对每个读入的数字进行数位拆分
然后对他们进行数位大小的排序,所用的法则就上上面讲的,这个排序算法要自己写
最后输出即可,排序时可以用一个数组记录他们的序号顺序即可
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n;
bool isbt(int* a,int* b){
int aa=0,bb=0;
while(a[aa]!=-1&&b[bb]!=-1){
if(a[aa]>b[bb]){
return true;
}else if(a[aa]<b[bb]){
return false;
}
aa++;
bb++;
if(a[aa]==-1&&b[bb]==-1){
return false;
}else if(a[aa]==-1){
aa=0;
}else if(b[bb]==-1){
bb=0;
}
}
return false;
}
void qsort(int num[][40],int* xl){
for(int i=1;i<n;i++){
int t=xl[i];
for(int j=i-1;j>=0;j--){
if(isbt(num[t],num[xl[j]])){
xl[j+1]=xl[j];
}else{
xl[j+1]=t;
break;
}
}
if(xl[0]==xl[1]){
xl[0]=t;
}
}
}
int main(){
scanf("%d",&n);
int num[n+1][40];
memset(num,-1,sizeof(num));
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
int cur=0;
while(x>0){
num[0][cur]=x%10;
x/=10;
cur++;
}
cur--;
int y=cur;
for(int j=0;j<=y;j++){
num[i][j]=num[0][cur];
cur--;
}
}
int xl[n];
for(int i=1;i<=n;i++){
xl[i-1]=i;
}
qsort(num,xl);
for(int i=0;i<n;i++){
for(int j=0;num[xl[i]][j]!=-1;j++){
printf("%d",num[xl[i]][j]);
}
}
return 0;
}