题解 | 元素方碑

元素方碑

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")

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务