列表

详情


WY77. 相等序列

描述

题目给定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

原站题解

C 解法, 执行用时: 35ms, 内存消耗: 704KB, 提交时间: 2021-09-21

#include <stdio.h>
#include <stdbool.h>

int max(int a,int b,int c)
{
    if(a>b && a>c)
        return a;
    if(b>a && b>c)
        return b;
    return c;
}

int min(int a,int b,int c)
{
    if(a<b && a<c)
        return a;
    if(b<a && b<c)
        return b;
    return c;
}

int main()
{
    int k;
    while(scanf("%d",&k)!=EOF)
    {
        while(k--)
        {
            int n;
            scanf("%d",&n);
            int arr[n],index=0;
            int a=-1,b=-1,c=-1;
            bool flag=true;
            while(index<n)
            {
                scanf("%d",&arr[index]);
                if(a==-1 && arr[index]!=a)
                {
                    a=arr[index];
                    index++;
                    continue;
                }
                if(arr[index]==a)
                {
                    index++;
                    continue;
                }
                if(b==-1 && arr[index]!=b)
                {
                    b=arr[index];
                    index++;
                    continue;
                }
                if(arr[index]==b)
                {
                    index++;
                    continue;
                }
                if(c==-1 && arr[index]!=c)
                {
                    c=arr[index];
                    index++;
                    continue;
                }
                if(arr[index]==c)
                {
                    index++;
                    continue;
                }
                flag=false;
                index++;
            }
            if(!flag)
            {
                printf("NO\n");
                continue;
            }
            if(a!=-1 && b!=-1 && c!=-1)
            {
                int maxn=max(a,b,c);
                int minn=min(a,b,c);
                int mid;
                if(a!=maxn && a!=minn)
                    mid=a;
                if(b!=maxn && b!=minn)
                    mid=b;
                if(c!=maxn && c!=minn)
                    mid=c;
                if((maxn-mid)!=(mid-minn))
                    printf("NO\n");
                else
                    printf("YES\n");
                continue;
            }
            printf("YES\n");
        }
    }
}

C++ 解法, 执行用时: 35ms, 内存消耗: 2952KB, 提交时间: 2020-07-10

#include<stdio.h>
int main(){
    int k;
    scanf("%d",&k);
    while(k--){
        int a[100001];
        int n;
        for(int i=0;i<100001;i++){
            a[i]=0;
        }
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            int num;
            scanf("%d",&num);
            a[num]=1;
        }
        int num[5];
        for(int i=0;i<5;i++){
            num[i]=0;
        }
        int j=0;
        for(int i=0;i<100001;i++){
            if(a[i]==1){
                if(j>3){
                    break;
                }
                num[j]=i;
                j++;
            }
        }
        if(j>3){
            printf("NO\n");
        }
        if(j>=0&&j<3){
            printf("YES\n");
        }
        if(j==3){
            if(num[2]-num[1]==num[1]-num[0]){
                printf("YES\n");
            }
            else{
                printf("NO\n");
            }
        }
    }
return 0;
}

上一题