模拟想要解开谜题时的操作即可,
先看总元素量,如果他不能被n块方碑平分,那么它一定是无解的。
对于能够平分的情况:
从左往右依次处理元素方碑
对于第i块方碑(i<n-2),对他的操作有3种情况:
1.a[i]==p(平均元素量),不做任何操作
2.a[i]<p,应该反面轰击第i+1块方碑,让a[i+2]中的元素流到第i块方碑,直到元素量和p相同
3.a[i]>p,应该正面轰击第i+1块方碑,让第i块元素方碑的元素流向第i+2块元素方碑中,
这样到最后就只会剩下最后两个方碑,前面的方碑全部都是处理好的,如果这两个元素方碑的元素量都是p,就能排序好,输出YES,否则输出NO
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
vector<int>s(n);
long long sum=0;
for(int i=0;i<n;i++){
cin>>s[i];
sum+=s[i];
}
if(sum%n!=0){//当元素量不能被平分的时候
cout<<"NO"<<endl;
return;
}
int p = sum/n;
for(int i=0;i<n;i++){//依次处理元素方碑的元素
if(s[i]<p && i+2<n){
s[i+2] -= p-s[i];
}else if(s[i]>p && i+2<n){
s[i+2] += s[i] - p;
}else if(i+2==n){//判断最后两个元素方碑的元素量
if(s[i]!=p || s[i+1]!=p){
cout<<"NO"<<endl;
return;
}
}
}
cout<<"YES"<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}

京公网安备 11010502036488号