Algorithm3 交叉

[TOC]

交叉

交换纸牌:使之数量相等

题目链接:https://www.luogu.com.cn/problem/P1031

1、题目大意是允许相邻的两个牌堆交叉换牌

2、解决方案就是把交叉换成单向,然后通过单边尽头单向遍历简化问题【单边尽头单向可以的原因就是每次至少保证满足1个,然后就算是其他的中间往两边的,也最多了,每次只能满足一个,所以不如直接 单边 尽头 => 方便遍历】

#include <iostream>
using namespace std;
#define maxn 105
int n, a[maxn], sum = 0, ans = 0;

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {scanf("%d", &a[i]);sum += a[i];}
    sum /= n;
    for (int i = 0; i < n - 1; ++i)
        if (a[i] != sum) {
            a[i + 1] -= (sum - a[i]);
            ans++;
        }
    printf("%d\n", ans);
    return 0;
}
Posted on Feb 1, 2021