zoukankan      html  css  js  c++  java
  • HackerRank

    It is modulo version of "max sum of contiguous subarray". So similar pattern can be applied too, but with tricks regarding to modulo ops.

    I checked editorials, and found that, the quickcorrect solution requires sharp insight into internal characteristics and mechanism of one problem... which I'm still lack with...

    Modulo, you should feel of it is as a roll-over game. If within the scope, like (3 - 1)%3, there's nothing special; and if beyond the scope like (1 - 3)%3, you get it roll-over from the beginning..

    And another key trick is, std::lower_bound() upon std::set is slower than set::lower_bound()..

    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <string>
    #include <climits>
    #include <iostream>
    #include <algorithm>
    #include <unordered_map>
    #include <unordered_set>
    using namespace std;
    
    int dp(vector<int> &in, int m)
    {
        int ret = 0;
        size_t len = in.size();
    
        vector<int> dp(len, 0);
    
        for (int ilen = 1; ilen <= len; ilen ++)
        for (int i = 0; i <= len - ilen; i++)
        {
            dp[i] += in[i + ilen - 1];
            ret = std::max(ret, dp[i] % m);
        }
        return ret;
    }
    
    int main()
    {
        int t; cin >> t;
        while (t--)
        {
            long long n, m; cin >> n >> m;
        
            long long x, prefix = 0, ret = 0;
            set<long long> s;
            s.insert(0);
            for (int i = 0; i < n; i++)
            {
                cin >> x;
                prefix = (prefix + x) % m;
                
                //    Case 1: prefix - 0 
                //        (for smaller prefixes)
                ret = std::max(ret, prefix); 
    
                //    Case 2: prefix - smallest_larer + m 
                //        (for larger prefixes)
                auto it = s.lower_bound(prefix + 1);
                if (it != s.end())
                {
                    ret = std::max(ret, prefix - *it + m);
                }
    
                s.insert(prefix);
            }
            cout << ret << endl;
        }
        return 0;
    }
  • 相关阅读:
    Android开发学习笔记-关于Android的消息推送以及前后台切换
    C#文件操作工具类
    c#取得应用程序根目录
    Visual Studio 2012中使用GitHub
    C#邮件发送
    jquery判断某个属性是否存在 hasAttr
    js 如何让两个等长的数组产生键值对关系
    js判断一个元素是否在数组中
    日期控件
    react 生命周期函数的一些心得体会
  • 原文地址:https://www.cnblogs.com/tonix/p/4522240.html
Copyright © 2011-2022 走看看