zoukankan      html  css  js  c++  java
  • 51nod 1097 拼成最小的数

    这里写图片描述

    排序。。。

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    const int MAXN = 1e4 + 10;
    const int MAXA = 11;
    
    struct num
    {
        char A[MAXA];   //  数据
        int num;        //  值
        int len;        //  长度
    } Num[MAXN];
    
    bool cmp(num a, num b)
    {
        //  长度相同则比较大小
        if (a.len == b.len)
        {
            return a.num < b.num;
        }
    
        int lenMin = a.len > b.len ? b.len : a.len;
    
        //  逐位比较 从小到大排
        for (int i = 0; i < lenMin; i++)
        {
            if (a.A[i] != b.A[i])
            {
                return a.A[i] < b.A[i];
            }
        }
    
        //  0~lenMin-1为相同部分(一个是另一个的前缀)
        //  如果lenMin位小于0位,则排在前边
        //  (1)、(2)是为了改变类似于4177、41774,4577、45774的顺序
        if (a.len > b.len)
        {
            int i = 0;
            while (a.A[lenMin] == a.A[i])
            {
                lenMin++;
                i++;
            }
            if (lenMin == a.len)        //  (1)
            {
                return a.A[1] > a.A[0];
            }
            return a.A[lenMin] < a.A[i];
        }
        else
        {
            int i = 0;
            while (b.A[lenMin] == b.A[i])
            {
                lenMin++;
                i++;
            }
            if (lenMin == b.len)        //  (2)
            {
                return b.A[1] < b.A[0];
            }
            return !(b.A[lenMin] < b.A[i]);
        }
    }
    
    int main(int argc, const char * argv[])
    {
    //    freopen("/Users/zyj/Desktop/input.txt", "r", stdin);
    //    freopen("/Users/zyj/Desktop/output.txt", "w", stdout);
    
        int N;
        cin >> N;
    
        int len = 0;
        for (int i = 0; i < N; i++)
        {
            scanf("%s", Num[i].A);
            Num[i].num = atoi(Num[i].A);
            Num[i].len = (int)strlen(Num[i].A);
            len += Num[i].len;
        }
        sort(Num, Num + N, cmp);
    
        //  输出(每行最多1000字符)
        int flag = 0;
        for (int i = 0; i < N; i++)
        {
            if (flag + Num[i].len < 1000)
            {
                flag += Num[i].len;
                cout << Num[i].A;
            }
            else
            {
                for (int j = 0; j < Num[i].len; j++)
                {
                    cout << Num[i].A[j];
                    if (++flag == 1000)
                    {
                        cout << '
    ';
                        flag = Num[i].len - j - 1;
                        printf("%s", Num[i].A + j + 1);
                        break;
                    }
                }
            }
        }
    
        cout << '
    ';
    
        return 0;
    }
  • 相关阅读:
    Chrome
    给Xshell增加快速命令集
    Integer对象大小比较问题
    maven的mirror和repository加载顺序
    maven的settings.xml详解
    OAuth2.0 RFC 6749 中文
    Linux下netstat命令简单操作
    Linux里的几种不同的压缩命令小记
    [ASIS 2019]Unicorn shop
    Metasploit魔鬼训练营第一章作业
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386928.html
Copyright © 2011-2022 走看看