zoukankan      html  css  js  c++  java
  • 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;
    }
    



  • 相关阅读:
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    Alpha 冲刺 (5/10)
    18软工实践-团队现场编程实战(抽奖系统)
    Alpha 冲刺 (4/10)
    BETA(4)
    BETA(3)
  • 原文地址:https://www.cnblogs.com/zhangxianlong/p/10672562.html
Copyright © 2011-2022 走看看