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;
    }
  • 相关阅读:
    poj 1733 Parity game
    poj 1456 Supermarket
    bzoj 1304 [CQOI 2009] 叶子的染色
    51Nod 1667 概率好题
    2015年阿里巴巴校招研发工程师在线笔试题汇总
    从字符串常量起说内存分配
    字符串笔面试题
    排序算法(4)-线性时间排序
    华为2015校园招聘机试
    笔画宽度变化(C++和matlab算法)
  • 原文地址:https://www.cnblogs.com/tonix/p/4522240.html
Copyright © 2011-2022 走看看