一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
P1031 [NOIP2002 提高组] 均分纸牌 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
二、解题报告
1、思路分析
为什么突然做这样简单一道题呢?P4016 负载平衡问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)这个题本来是网络流24题里面的,然后可以被纸牌均分这个题的做法秒杀
我们看本题,我们假设平均数为avg,原数组为a[],构造新数组s[] = a[] - avg
我们的目标就是让s[]数组变0,s[i]的绝对值代表第i个人需要的纸牌或者需要送出去的纸牌
而由于两头的两个人传递单向,所以我们从左往右遍历,把s[0]累加到s[1]上面,代表第0个人被第一个满足了,那么第一个人就要继承第0个人的s值,可能为正也可能为负,无论怎样,由于第0个人已经满足,第1个人不能和第0个人之间再发生交换了,所以还得往右遍历,累加。。。。
遍历过程中,如果s[]等于0,那么说明这个人已经平衡不需要进行纸牌交换就不管
否则累加这个人的s[]值,然后ans++
最终答案就是ans
2、复杂度
时间复杂度: O(n)空间复杂度:O(n)
3、代码详解
#include <bits/stdc++.h>
const int N = 105;
int n, s, ans, a[N];
int main () {
std::cin >> n;
for (int i = 0; i < n; i ++) std::cin >> a[i], s += a[i];
s /= n;
for (int i = 0; i < n; i ++) {
a[i] -= s;
if (a[i])
a[i + 1] += a[i], ans ++;
}
std::cout << ans;
return 0;
}