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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值