官方题解
2024-03-21 16:48:57
发布于:浙江
61阅读
0回复
0点赞
【算法分析】
牌数一定可以分到一样多,相邻两堆牌之间最多只移动纸牌一次(最优方案)。
每一次移动可以看成相邻两堆牌中左边一堆 向 右边一堆 移动 张牌。
x>0,左往右移动一次;
x<0,右往左移动一次;
x==0,不移动
【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;
int a[110];
int main() {
int n, sum = 0, cnt = 0;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
sum += a[i];
}
int avg = sum / n;
for(int i = 1; i <= n; i++){
if(a[i] == avg){ //牌数和均分的结果相等,不需要移动
continue;
}
a[i + 1] = a[i] - avg + a[i + 1]; //a[i+1]记录原i+1处牌数和 前面缺少或增多 的牌数之和
cnt++; //牌数和均分的结果不等,需要向右边移牌或者右边向此处移牌,移动次数加1
}
cout << cnt;
return 0;
}
【时间复杂度】
【预计得分】
这里空空如也
有帮助,赞一个