拼数(NOIP1998)

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;
}

猜你喜欢

转载自blog.csdn.net/cggwz/article/details/81209034