【2019網易校招】相等序列

題目描述
題目給定a1,a2…an,這樣一個長度爲n的序列,現在你可以給其中一些元素加上一個值x(只能加一次),然後可以給另外一些值減上一個值x(只能減一次),剩下的元素不能再進行操作。問最後有沒有可能找到一個值x使所有元素的值相等。
題目鏈接

輸入描述:

輸入第一行爲一個整數k,代表有k個序列(k<100),接下來有2*k行:
偶數行爲一個整數n,代表給定序列的長度(1<=n<=100,000)
奇數行包含n個元素,a1,a2…an,代表序列中的元素(0<=ai<=100,000)

輸出描述:

輸出k行,每行一個YES或者NO

示例1
輸入

1
5
1 3 3 2 1

輸出

YES

AC代碼:

C++版本

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
const int maxn = 0x3f3f3f3f;
 
bool solve(int* arr, int n)
{
    if (n <= 2)
    {
        return true;
    }
    sort(arr, arr + n);
    int newLength = unique(arr, arr + n) - arr;
    if (newLength <= 2)
    {
        return true;
    }
    else if (newLength == 3)
    {
 
        if (arr[2] + arr[0] == 2 * arr[1])
            return true;
        else
            return false;
    }
    else
        return false;
}
 
int main()
{
    ios::sync_with_stdio(false);
    int k;
    while (~scanf("%d", &k))
    {
        for (int i = 0; i < k; i++)
        {
            int n;
            scanf("%d", &n);
            int* arr = (int*)malloc(sizeof(int) * n);
            for (int j = 0; j < n; j++)
                scanf("%d", &arr[j]);
            solve(arr, n) ? puts("YES") : puts("NO");
        }
    }
    return 0;
}

C版本

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
 
typedef long long ll;
const int maxn = 0x3f3f3f3f;
 
void removeRepeat(int* arr, int* length)
{
    int i = 1;
    int k = 1;
    int tmp = arr[0];
    while (i < *length)
    {
        if (tmp != arr[i])
        {
            arr[k] = arr[i];
            k++;
            i++;
            tmp = arr[i];
        }
        else
        {
            i++;
        }
    }
    *length = k;
}
 
int cmp(const void* a, const void* b)
{
    return (*(int*)a - *(int*)b);
}
 
bool solve(int* arr, int n)
{
    if (n <= 2)
        return true;
    qsort(arr, n, sizeof(int), cmp);
    int newLength = n;
    removeRepeat(arr, &newLength);
    if (newLength <= 2)
    {
        return true;
    }
    else if (newLength == 3)
    {
 
        if (arr[2] + arr[0] == 2 * arr[1])
            return true;
        else
            return false;
    }
    else
        return false;
}
 
int main()
{
    int k;
    while (~scanf("%d", &k))
    {
        for (int i = 0; i < k; i++)
        {
            int n;
            scanf("%d", &n);
            int* arr = (int*)malloc(sizeof(int) * n);
            for (int j = 0; j < n; j++)
                scanf("%d", &arr[j]);
            int* tmp = &n;
            solve(arr, *tmp) ? puts("YES") : puts("NO");
        }
    }
    return 0;
}

時空消耗對比:


圖1 C++版本代碼代碼時空消耗



圖2 C版本代碼時空消耗

C版本較C++,
時間增加

70 ms

佔比增加

15888158\frac{158 - 88}{158} × 100% \approx 44.3 %

空間減少

248KB,

佔比減少

431640684068\frac{4316- 4068}{4068} × 100% \approx 6.1%

下面兩圖分別是多次在OJ上的運行時空消耗情況和平均計算。


圖3 OJ多次判決情況




圖4 時空消耗平均值計算



統計平均,C版本較C++,
時間增加

60 ms

佔比增加

12565125\frac{125- 65}{125} × 100% \approx 48 %

空間減少

684 KB,

佔比減少

316824842484\frac{3168- 2484}{2484} × 100% \approx 27.5 %

可見,並非C語言的代碼一定比C++的性能更好(或者反之),實際效果完全取決於程序員的水平。哈哈哈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章