2 条题解

  • 0
    @ 2025-10-17 21:42:43

    saki酱●█▀█▄saki酱●█▀█▄saki酱●█▀█▄

    题目分析

    根据题意不难得出,对于任意被操作的两个数的下标的奇偶性是相同的;同时,无论怎么操作,所有奇数项或偶数项的总和是不变的。所以可以满足题目要求的必要条件是奇数项的平均数和偶数项的平均数都是整数且相等。所以将数组的奇数项和偶数项求和再判断平均数是否为整数以及相等即可。

    代码如下(cpp):

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        int t;
        scanf("%d", &t);
        while(t--){
            int n;
            scanf("%d", &n);
            long long num1 = 0, num2 = 0;
            for(int i = 1; i <= n; i++){
                int x;
                scanf("%d", &x);
                if(i & 1) num1 += x;
                else num2 += x;
            }
            if(num1 % ((n + 1) / 2) == 0 && num2 % (n / 2) == 0 && (num1 / ((n + 1) / 2)) == (num2 / (n / 2)))
                printf("YES\n");
            else printf("NO\n");
        }
        return 0;
    }
    
    • 0
      @ 2025-10-13 20:29:11

      saki酱●█▀█▄saki酱●█▀█▄saki酱●█▀█▄

      首先,整个数组的总和不随操作与否而变化,而如果最后所有元素可能可以相等的一个前提是:数组所有元素和是数组大小的某个正整数倍(x)。其次,一个元素操作后可能影响的其他元素的序号的奇偶性必定与它本身的序号奇偶性一致,所以将数组分为奇数序号部分和偶数序号部分分别取和判断是否为元素数量的x倍即可

      参考代码(python)

      from sys import stdin,setrecursionlimit
      from math import inf,ceil,sqrt
      from collections import Counter,deque
      
      def solve():
          s1,s2=0,0
          for i in range(n):
              if i&1:
                  s1+=a[i]
              else:
                  s2+=a[i]
          if s1==g*(n//2) and s2==g*ceil(n/2):
              print('YES')
          else:
              print('NO')
      
      for _ in range(int(stdin.readline())):
          n=int(stdin.readline())
          a=[int(_) for _ in stdin.readline().split()]
          if sum(a)%n!=0:
              print('NO')
              continue
          g=sum(a)//n
          solve()
      
      
      • 1

      [2025 实验室一面] saki酱●█▀█▄saki酱●█▀█▄saki酱●█▀█▄

      信息

      ID
      1097
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      77
      已通过
      14
      上传者