首页 > 其他 > 详细

HackerRank - "Maximise Sum"

时间:2015-05-22 14:52:49      阅读:116      评论:0      收藏:0      [点我收藏+]

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 quick\correct 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;
}

HackerRank - "Maximise Sum"

原文:http://www.cnblogs.com/tonix/p/4522240.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!