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

来源:互联网 发布:淘宝粉哥香水是正品吗 编辑:程序博客网 时间:2024/05/10 02:20

太弱了。。还是笨。。

原题

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

首先我们注意到 如果连续一段和为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
原创粉丝点击