1. 程式人生 > >【貪心 && 字首和相等之間序列和為 0】CodeForces

【貪心 && 字首和相等之間序列和為 0】CodeForces

Step1 Problem:

n 個銀行圍成一圈存款有正有負,總和為 0,你移動存款只能移動到相鄰的銀行,問你最少的移動次數使得所有銀行存款都是 0.

Step2 Ideas:

num 個銀行存款和為 0,最多移動 num-1 次就可以使得所有銀行存款為 0。
我們只需要將 n 個銀行分成儘可能多的和為 0 的連續序列。
假設最多可以分成 k 個序列,那麼結果為 n-k。
如何求 k 個序列:
我們可以列舉每一個開始的位置,求出多少個序列,然後取最大值,這個方法顯然是 O(n*n),但是你可以發現它重複計算了很多次。
如果預處理出字首和,字首和相等代表之間序列和為 0

。這樣我們就可以快速的知道哪些序列和為 0,列舉每個開始的位置,和這個位置字首和相等的位置之間序列為 0,所以相當於字首和出現的次數為 列舉位置 的序列個數

Step3 Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<ll, int> hs;
int main()
{
    int n, ans;
    while(~scanf("%d", &n))
    {
        ll num, sum = 0;
        ans = 0;
        hs.clear();
        for
(int i = 0; i < n; i++) { scanf("%lld", &num); sum += num; int t = ++hs[sum]; ans = max(ans, t); } printf("%d\n", n - ans); } return 0; }