Codeforces #353 (Div. 2)C 贪心脑洞题

太弱了。。还是笨。。

原题

这题脑洞题,说一下贪心思路。

首先我们注意到 如果连续一段和为0,其他部分耿直的转移,那么就能少移动一次(中间不考虑子段,只让这一段变成了0),

如果 这一段后面还有连续的一段和为0 ,那么就能少移动两次。。

以此类推。。。

例如 xxxxxxxxxxx1 2 -2 -1 1 -1xxxxxxxx

如果中间那些耿直的移动一定是要移动6次才能都是0的,如果分成两段的话,明显只要4次。。

ps。为什么断开不行?因为断开中间的那些是要跨过两段的0 的,这样和中间断开至少有一个,那么好不容易节约下来的又要被移动中间那个花费掉了(甚至更多)。

 

所以就有了贪心策略,找到最多的连续0的方法。。这里就要考虑维护前缀和了。。

 

PPS。是个环你没有考虑呀?

其实不然,当我们取出最长的若干段的时候,剩下的一定是和为 0 。那么就很愉快了,答案就是 N - ANS 了。。

写这么多可能还是没讲清楚,请大家见谅,确实自己理解也不深刻,蒟蒻加油吧~

 

 

#include <bits/stdc++.h>

using namespace std;

map<long long,long long> mp;

int main(){
    int n ,x ;
    long long ans=0;
    long long sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        sum+=x;
        ans=max(ans,++mp[sum]);
    }
    cout<<n-ans<<endl;
    return 0;
}



 

posted @ 2016-06-19 21:28  zhangxianlong  阅读(87)  评论(0编辑  收藏  举报