首页 > 试题广场 >

元素方碑

[编程题]元素方碑
  • 热度指数:136 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解


\hspace{15pt}菲谢尔在稻妻冒险途中遇到一排神奇的元素方碑,其中第 i 个方碑初始时的能量为 a_i。只要她对第 i 块方碑施放雷元素,就会发生能量转移:

\hspace{23pt}\bullet\,正面轰击:雷元素从第 i-1 块流向第 i+1 块,使 a_{i-1}1a_{i+1}1
\hspace{23pt}\bullet\,反面轰击:雷元素从第 i+1 块流向第 i-1 块,使 a_{i+1}1a_{i-1}1

\hspace{15pt}操作只能在 2\leqq i\leqq n-1 的方碑上进行,且任何时刻所有方碑能量 a_{i} 必须保持非负。
\hspace{15pt}当所有方碑的能量 a_1,a_2,\dots,a_n 全部相等时,菲谢尔即可开启隐藏宝箱。
\hspace{15pt}菲谢尔可以无限次进行操作。请判断,她是否一定能够让所有方碑能量相等。

输入描述:
\hspace{15pt}第一行输入一个整数 t\left(1\leqq t\leqq 10^4\right)——测试用例组数。 
\hspace{15pt}对于每组测试数据:
\hspace{23pt}\bullet\,第一行输入一个整数 n\left(1\leqq n\leqq 2\times10^5\right)——方碑数量;
\hspace{23pt}\bullet\,第二行输入 n 个整数 a_1,a_2,\dots,a_n\left(1\leqq a_i\leqq 10^9\right)——初始能量。

\hspace{15pt}除此之外,保证单个测试文件中全部测试用例的 n 之和不超过 2\times10^5


输出描述:
\hspace{15pt}对每组测试数据,在一行上输出 \texttt{YES}\texttt{NO},表示能否通过若干次操作使所有方碑能量相等。
示例1

输入

8
3
3 2 1
3
1 1 3
4
1 2 5 4
4
1 6 6 1
5
6 2 1 4 2
4
1 4 2 1
5
3 1 2 1 3
3
2 4 2

输出

YES
NO
YES
NO
YES
NO
NO
NO

说明

\hspace{15pt}在第一组样例中: 
\hspace{23pt}\bullet\,对于数组 \{3,2,1\},先对下标 i=2 正面轰击一次,得到 \{2,2,2\},能量已全部相等;
\hspace{23pt}\bullet\,对于数组 \{1,2,5,4\},可依次正面轰击 i=3,反面轰击 i=2,最终得到 \{3,3,3,3\}
\hspace{23pt}\bullet\,对于数组 \{2,4,2\},无论如何操作,总能量 \sum a_i 不是 n 的倍数,因此无法全等,答案为 \texttt{NO}
#include <stdio.h>

void fun(int j,int k,int *a)
{
    //按规则可以推断只有单数角标相互可以相互做数据的转移,只有双数角标可以相互做数据的转移,所以只需要求平均即可知道是否能让能量相等
    int m = 0;//角标从0开始
    int count_m = 0;
    int sum_m = 0;
    int n = 1;//角标从1开始
    int count_n = 0;
    int sum_n = 0;

    while(m < j){
        sum_m += a[m];
        m += 2;
        count_m++;
    }
    while(n < j)
    {
        sum_n += a[n];
        n += 2;
        count_n++;
    }
    if((sum_m / count_m == k) &&(sum_m % count_m == 0) && (sum_n / count_n == k)&& (sum_n % count_n == 0))//只有正好整除才满足可以均分的情况
    {
        printf("YES\n");
    }else{
        printf("NO\n");
    }
}

int main() {
    int t,n,sum,j,k;
    int i = 0;
    scanf("%d", &t);
    int a[100];//n个整数,此处限制100个
   
    //要做t次
    while (t--) {
        i = 0;
        sum = 0;
        scanf("%d", &n);
        j = n;
        while(n--){
            scanf("%d", &a[i]) ;
            i++;
        }
        // printf("%d %d\n",i,n);
          while(i)
            {
                sum += a[i-1];
                i--;
            }
            if((sum % j) != 0)
            {
                printf("NO\n");
            }
            else
            {
                k = sum / j;
                fun( j,k,a);
            }
    }
 return 0;
}
发表于 2025-06-24 12:00:17 回复(0)