首页 > 试题广场 > 相等序列
[编程题]相等序列
题目给定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
//当序列中的数字种类大于3种,一定为NO,小于3种,一定为YES;
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main()
{ 
    int k;
    cin >> k;
    while (k > 0) {
        int l;
        cin >> l;
        set<int> data;//用一个set记录数字种类
        while (l > 0) {
            int n;
            cin >> n;
            data.insert(n);
            l--;
        }
        vector<int> Num;
        Num.assign(data.begin(), data.end());
        if (Num.size() >= 4) cout << "NO" << endl;//>=4,为NO
        else if (Num.size() <= 2) cout << "YES" << endl;//<=2,为YES
        else {
            if (Num[2]-Num[1]==Num[1]-Num[0]) cout << "YES" << endl;//==3时进一步判断
            else cout << "NO" << endl;
        }
        k--;
    }
    return 0;
}

发表于 2019-07-30 15:42:28 回复(0)
import sys
m=int(input())
if __name__ == "__main__":
    data=[]
while True:
    line = sys.stdin.readline().strip()
    if not line:
        break
    data.append(line)

for i in range(m):
    n=int(data[2*i])
    ls=list(map(int,data[2*i+1].split()))
    if n<3:
        print("YES")
        continue
    dic={}
    lis=[]
    for j in ls:
        dic[j]=dic.get(j,0)+1
    if len(dic)==1:
        print("YES")
    elif len(dic)==3:
        for k,v in enumerate(dic):
            lis.append(v)
        lis.sort()
        if 2*lis[1]==(lis[0]+lis[2]):
            print("YES")
        else:
            print("NO")
    else:
        print("NO")
         
编辑于 2019-08-02 20:28:49 回复(0)