【貪心 && 字首和相等之間序列和為 0】CodeForces
阿新 • • 發佈:2019-02-08
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;
}