• 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 }
  • 相关阅读:
    SpringBoot自定义HttpMessageConverter
    第一次使用Linux服务器所栽之坑
    入门Nginx
    HttpClient中的Timout
    SpringBoot启动
    SpringBoot注解
    百度2017春招笔试
    学习JUnit
    Mybatis中的@SelectKey注解
    PHP中MD5函数漏洞
  • 原文地址:https://www.cnblogs.com/titicia/p/5506756.html
Copyright © 2020-2023  润新知