codeforces 675C

C. Money Transfers
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

There are n banks in the city where Vasya lives, they are located in a circle, such that any two banks are neighbouring if their indices differ by no more than 1. Also, bank 1 and bank n are neighbours if n > 1. No bank is a neighbour of itself.

Vasya has an account in each bank. Its balance may be negative, meaning Vasya owes some money to this bank.

There is only one type of operations available: transfer some amount of money from any bank to account in any neighbouring bank. There are no restrictions on the size of the sum being transferred or balance requirements to perform this operation.

Vasya doesn't like to deal with large numbers, so he asks you to determine the minimum number of operations required to change the balance of each bank account to zero. It's guaranteed, that this is possible to achieve, that is, the total balance of Vasya in all banks is equal to zero.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of banks.

The second line contains n integers ai ( - 109 ≤ ai ≤ 109), the i-th of them is equal to the initial balance of the account in the i-th bank. It's guaranteed that the sum of all ai is equal to 0.

Output

Print the minimum number of operations required to change balance in each bank to zero.

Examples
input
3
5 0 -5
output
1
input
4
-1 0 1 0
output
2
input
4
1 2 3 -6
output
3
Note

In the first sample, Vasya may transfer 5 from the first bank to the third.

In the second sample, Vasya may first transfer 1 from the third bank to the second, and then 1 from the second to the first.

In the third sample, the following sequence provides the optimal answer:

  1. transfer 1 from the first bank to the second bank;
  2. transfer 3 from the second bank to the third;
  3. transfer 6 from the third bank to the fourth.


題意:

有n個銀行,每個銀行有一個賬戶,賬上的錢可能爲負,且n個銀行賬戶的錢總和爲0,兩個相鄰銀行的賬戶可以互相轉賬,因爲相當於一個圈所以1和n也可以相互轉帳。

求最少轉多少次可使每個賬戶上的錢都變成0。



思路:最多轉n-1次就夠了,找一個點,如果不爲零那麼下一個點的價值加上這個點的價值直到和爲0爲止。

如果中間有一段和爲0的,假如長度爲l,那麼次數只要l-1,所以每多一個這樣的段總數就可以減少1。

那麼就是找出最多的中間和爲0的段的數量就可以了。

因此只需要使用前綴和就可以,如果每加一次出現的值在之前出現過那麼就說明在這個區間中出現過和爲0的情況,記錄一下次數就可以了。

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
#include <utility>
#include <cmath>
#include <cstdlib>
#include <stack>
#define mv(a,b) memset(a,b,sizeof(a));
#define max(a,b)(a>b?a:b)
#define min(a,b)(a<b?a:b)
using namespace std;
typedef long long LL;
const int maxn=100000+10;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double PI =acos(-1.0);
typedef pair<int,int>pp;
void input()
{
	freopen("in.txt","r",stdin);
	freopen("ccout.txt","w",stdout);
}
map<LL,int>mp;
int main()
{
	//input();
	int n;
	while(cin>>n)
	{
		LL a,sum;
		sum=0;
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a;
			sum+=a;
			mp[sum]++;
			ans=max(ans,mp[sum]);
		}
		cout<<n-ans<<endl;
	}
}

 

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章