zoukankan      html  css  js  c++  java
  • Codeforces 675C Money Transfers 思维题

    原题:http://codeforces.com/contest/675/problem/C

      让我们用数组a保存每个银行的余额,因为所有余额的和加起来一定为0,所以我们能把整个数组a划分为几个区间,每个区间的和都为0。对于每个区间来说,设该区间长度为l,则让该区间都为0的操作数为l-1,例如:1 、1 、-3 、1的操作数为3,也就是说,若把a分成k个区间,则a所需要的总的操作数为n-k。

      所以现在我们的目标就是把数组a划分为尽可能多的部分,这个时候我们可以用一个map,统计前缀和的个数,因为对于有若干个和为0的区间的前缀和是相同的,例如:1 、-1和1 、-1 、2 、-2。

     1 #include<stdio.h>
     2 #include<map>
     3 #include<algorithm>
     4 using namespace std;
     5 int main(){
     6     int n;
     7     scanf("%d",&n);
     8     map<long long,int>mp;
     9     int ans = n-1;//初始情况下整个数组为一个区间
    10     int t;
    11     long long sum = 0;
    12     for(int i = 0;i<n;i++){
    13         scanf("%d",&t);
    14         sum += t;
    15         mp[sum]++;
    16         ans = min(ans,n-mp[sum]);
    17     }
    18     printf("%d",ans);
    19     return 0;
    20 }
  • 相关阅读:
    两条斜线
    Cantor表
    城市网络
    一起来数二叉树吧
    牛客网音乐研究(枚举)
    删括号
    合并回文子串
    寻找道路
    EXTJS 4.0.2 XML数据
    extjs4.0.2a gridpanel看不到横向滚动条的一种原因
  • 原文地址:https://www.cnblogs.com/zqy123/p/5503280.html
Copyright © 2011-2022 走看看