Codeforces Round #353 (Div. 2) C. Money Transfers 贪心+前缀和

来源:互联网 发布:qq音速网络连接 编辑:程序博客网 时间:2024/06/04 20:14

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


题意:

n个银行形成环,一个人在每个银行资产有正有负,现在要求相邻银行之间可以转移资产,使得最后每个银行资产为零。

保证sum=0,求最小转移次数


首先最坏的情况,从第一个银行一直转移到最后一个银行,这样的话 最小转移次数=n-1

如果我们找到一个区间的区间和为零,那么就把原序列划分成两个区间,总的最小转移次数=n-2

以此类推,找到越多区间和为零的不相交小区间,最小转移次数就越少。


怎么找最多的零区间呢?


假设第一个环是从i开始的,那么前缀和S【i】==S【j】表示区间【i+1,j】的和为0,那么下一个环必然是从j+1开始,下一个环的右端点必然是k,满足S【k】==S【j】,同理以后的环都是S【k1】=S【k2】=S【i】....

也就是我们只需要看有多少前缀和值等于s[i],就能找到第一个环从i开始的情况下,能找到最多的零区间


所以我们要找最多的零区间,就变成找所有的前缀和里 重复次数最多的一个


复杂度nlogn

#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>#include<stack>using namespace std;map<long long ,int>mp;int main(){    int n;    cin>>n;    long long sum=0;    int x,ans=0;    for (int i=1; i<=n; i++)    {        scanf("%d",&x);        sum+=x;        mp[sum]++;        ans=max(ans,mp[sum]);    }    printf("%d\n",n-ans);    return 0;}


0 0
原创粉丝点击