codeforces 675C Money Transfers 贪心

题目链接:http://www.codeforces.com/problemset/problem/675/C

题意:

有n个银行,每个银行有一个账户,账上的钱可能为负或正或0,且n个银行账户的钱和为0,两个相邻银行的账户可以互相转账,1和n也可以,相当于一个圈。

求最少转多少次可使每个账户上的钱都变成0。

思路:

很明显最多转n-1次就可以满足要求了,即随便选一个点,把每个点的值依次加到下一个点,直到该点的前一个点。

那么假如中间有一段和为0的,假如长度为l,那么次数只要l-1,所以每多一个这样的段总数就可以减少1。

那么就是找出最多的中间和为0的段的数量就可以了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int a[100010];
 5 long long sum;
 6 int main() 
 7 {
 8   //  freopen("in.txt", "r", stdin);
 9   //  freopen("out.txt", "w", stdout);
10     while(~scanf("%d", &n))
11     {
12         sum = 0;
13         for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
14 
15         map <long long, int> mp;
16         mp[0] = 1;
17         int ans = 1;
18         for(int i = 1; i < n; i++)
19         {
20             sum += a[i];
21             mp[sum]++;
22             if(mp[sum] >= ans) ans = mp[sum];
23         }
24         printf("%d
", n-ans);
25     }
26     return 0;
27 }
原文地址:https://www.cnblogs.com/titicia/p/5506756.html