• 【nyoj-1233】差值


    描述

         输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值。例如输入数组{1,  2},则输出9。

     
     

    输入

    第一行输入一个整数T,表示有T组测试数据。每组测试数据的第一行输入一个整数n(0<n<=1000),第二行输入n个整数ai(0<=ai<2^32)。

    输出

    输出最大数最小数的差值,输出占一行。

    样例输入

    1
    3
    1 2 3

    样例输出

    198
    大整数减法,关键是想好如何排序。排序规则是比较s1+s2和s2+s1的大小。
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 21000;
    struct node
    {
        char s[20];
    } q[1015];
    int a[N], b[N];
    bool gminus(int *a,int *b)
    {
        for(int i = 1; i <= a[0]; i++)
        {
            if(a[i]<b[i])
            {
                a[i+1]--;
                a[i]+=10;
            }
            a[i]=a[i]-b[i];
        }
        while(a[a[0]]==0&&a[0]) a[0]--;
        if(!a[0]) return 0;
        return 1;
    }
    int cmp(node a,node b)
    {
        int la=strlen(a.s);
        int lb=strlen(b.s);
        int l=max(la,lb);
        for(int i=0; i<l; i++)
        {
            if(a.s[i%la]<b.s[i%lb])
                return 1;
            else if(a.s[i%la]>b.s[i%lb])
                return 0;
        }
        return 1;
    }
    int main()
    {
        int t, n;
        cin>>t;
        while(t--)
        {
            scanf("%d", &n);
            for(int i = 0; i < n; i++) scanf("%s", q[i].s);
            sort(q, q+n, cmp);
            char s[N];
            memset(s, 0, sizeof s);
            for(int i = 0; i < n; i++)
                strcat(s, q[i].s);
            int num = 0, l = strlen(s);
            for(int i = l-1; i >= 0; i--)
                b[++num] = s[i]-'0';
            b[0] = num, num = 0;
            memset(s, 0, sizeof s);
            for(int i = n-1; i >= 0; i--)
                strcat(s, q[i].s);
            for(int i = l-1; i >= 0; i--)
                a[++num] = s[i]-'0';
            a[0] = num;
            bool f = gminus(a, b);
            if(!f) printf("0");
            else
                for(int i = a[0]; i>=1; i--)
                    printf("%d", a[i]);
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    P5356 [Ynoi2017]由乃打扑克
    P4921 [MtOI2018]情侣?给我烧了!/P4931 [MtOI2018]情侣?给我烧了!(加强版)
    P2605 [ZJOI2010]基站选址
    CF1062E Company
    kd-tree
    扩展中国剩余定理(EXCRT)
    CF264C Choosing Balls
    CF1139D Steps to One
    P4655 [CEOI2017]Building Bridges
    P3311 [SDOI2014] 数数
  • 原文地址:https://www.cnblogs.com/lesroad/p/9211063.html
Copyright © 2020-2023  润新知