3 条题解

  • 2
    @ 2022-10-29 20:17:28

    首先一眼题可以想到是差分+排序,每一次操作都排,但说实话不见得每次排序把所有元素全部排一遍,前面是0的可以忽略不计,因为不管怎么排,0始终在前面,所以只需要排后面的非零元素就好啦,然后上个代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    int a[N];
    int main()
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            int n;
            scanf("%d", &n);
            int ans = n;
            for (int i = 1; i <= n; i++)
            {
                scanf("%d", &a[i]);
            }
            for (int i = 1; i <= n; i++)
            {
                if (a[i] != 0)
                {
                    ans = i - 1;
                    break;
                }
            }
            if (ans == 0)
            {
                ans = 1;
            }
            while (n > 1) //找第一个不为0的位置的前一个位置,因为如果是0的话,那相减还是0,排序后还是在最前面,排了也没用
            {
                for (int i = ans; i <= n; i++)
                {
                    a[i] = a[i + 1] - a[i];
                }
                --n;
                sort(a + ans, a + 1 + n);
                if (ans > 1)
                {
                    ans--;
                }
                while (ans + 1 <= n && a[ans + 1] == 0)
                {
                    ++ans;
                }
            }
            printf("%d\n", a[1]);
        }
        return 0;
    }
    

    信息

    ID
    817
    时间
    2000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    332
    已通过
    28
    上传者