题解 | 元素方碑
元素方碑
https://www.nowcoder.com/practice/5c6e7ed4726e41f4ac99a4dedf1e5bb2
#include <iostream>
#include <vector>
using namespace std;
const int MAXZ = 2e5 + 5;
//先进行求和判断是否能能量相等(是否能被整除),如果可以,则判断进行轰击能否使能量相等
// 判断元素在2到n-1进行遍历,左边加的数等于右边减的数,右边加的数等于左边减的数
int main() {
int t, n;
cin >> t;
for (int i = 1; i<=t; i++){
cin >> n;
long long sum = 0;
int item;
int v[MAXZ];
for (int j = 0; j <n ; j++) {
cin >> v[j];
sum += v[j];
}
item = sum/n;
if ((item * n ) != sum) cout <<"NO\n";
else {//能被整除,则进行轰击
for (int j = 1; j<n-1; j++){
if (v[j-1] == item) continue;
else if (v[j-1] >item){ //正面轰击
int temp1 = v[j-1] - item;
v[j-1] = item;
v[j+1] += temp1;
}else if (v[j-1] < item){ //反面轰击
int temp2 = item - v[j-1];
v[j-1] = item;
v[j+1] -= temp2;
}
}
//检查轰击后是否相等
int flag = 0;
for (int j = n-1; j >=0; j--){
if (v[j] != item) {
flag = 1;
cout << "NO\n";
break;
}
}
if (flag == 0) cout <<"YES\n";
}
}
return 0;
}
// 64 位输出请用 printf("%lld")
