Codeforces 675C Money Transfers【贪心】【新年快乐】T T窝要去打联盟咯!

来源:互联网 发布:淘宝账户限制登录 编辑:程序博客网 时间:2024/05/17 21:50

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
35 0 -5
output
1
input
4-1 0 1 0
output
2
input
41 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个银行,其围成了一个圈,每个银行只能直接向相邻的银行转款任意数量的金钱,使得最终需要让所有银行都达到金额为0.

问最少需要进行多少次操作。


思路:


很显然最多操作次数也就N-1(即从第一个一直转款到最后一个再回原位.);

那么如果对应再扫的过程中遇到了sum==0的情况,那么此时就有一个区间sum【l,r】==0;那么我们就没有必要再从这个r银行转到r+1银行了,所以此时我们就省去了一次操作。

我们接下来的任务就是去统计这样的区间个数即可。

ans=n-区间个数。


Ac代码:


#include<stdio.h>#include<string.h>#include<map>using namespace std;#define ll __int64ll a[100500];int main(){    int n;    while(~scanf("%d",&n))    {        ll sum=0;        int ans=0;        map<ll ,int >s;        for(int i=0;i<n;i++)        {            scanf("%I64d",&a[i]);            sum+=a[i];s[sum]++;            if(s[sum]>ans)ans=s[sum];        }        printf("%d\n",n-ans);    }}







0 0
原创粉丝点击