題目描述
題目給定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;
}
時空消耗對比:
C版本較C++,
時間增加:
70 ms
佔比增加:
× 100% 44.3 %
空間減少:
248KB,
佔比減少:
× 100% 6.1%
下面兩圖分別是多次在OJ上的運行時空消耗情況和平均計算。
統計平均,C版本較C++,
時間增加:
60 ms
佔比增加:
× 100% 48 %
空間減少:
684 KB,
佔比減少:
× 100% 27.5 %
可見,並非C語言的代碼一定比C++的性能更好(或者反之),實際效果完全取決於程序員的水平。哈哈哈!