zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    docker
    Flask
    JavaScirpt
    记录片- 走进肯德基 :十亿美元鸡肉店(2015)
    法正(3):扫黑
    法正(2):法雄
    法正(1):年表
    三国皇帝的寡妇秘史(2)
    三国皇帝的寡妇秘史(1)
    程序员的人性思考(下)
  • 原文地址:https://www.cnblogs.com/titicia/p/5506756.html
Copyright © 2011-2022 走看看