HackerRank - "Maximise Sum"

本文探讨了模运算版本的连续子数组最大和问题,并介绍了关键技巧,如模运算的滚动特性、`std::lower_bound()`在`std::set`中的应用。文章通过实例说明了如何在模运算约束下求解最大连续子数组和,提供了快速正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

转载于:https://www.cnblogs.com/tonix/p/4522240.html

OPCUA(OPC统一架构)是一种开放标准通信协议,用于工业自动化和其他领域的设备和系统之间的数据交换。它建立在 OPC Foundation 的基础之上,旨在替代早期的 OPC DA(OPC 数据访问),提供更安全、更高效且平台无关的通信方式。本压缩包“OPCUA与OPCServer通讯测试客户端程序.zip”包含了实现OPCUA客户端与OPCServer服务端通讯测试的相关资源。 1. OPCUA协议:OPCUA的核心特性在于它的服务导向架构,包括了数据访问、历史数据访问、报警和事件、方法调用等服务。它使用TCP/IP作为传输层,并支持SSL/TLS加密,确保数据传输的安全性。OPCUA还引入了发布/订阅模型,允许实时数据流的高效传输。 2. OPCServer:OPCServer是OPCUA架构中的一个组件,通常由设备制造商或软件供应商提供,它将特定设备或系统的数据暴露给OPCUA客户端,使得多个应用程序可以共享这些数据。例如,KepServer是OPCServer的一种,它可以连接到各种PLC(可编程逻辑控制器)、SCADA系统和其他工业设备。 3. OPCUA客户端:客户端是使用OPCUA协议来访问OPCServer服务的应用程序。在这个压缩包中,提供的客户端程序应该能够发现OPCServer,建立安全连接,浏览OPCServer提供的节点结构,读取和写入数据,以及订阅变化。 4. OPCUA访问KepServer:KepServer是OPC基金会认证的服务器,支持OPCUA协议。通过OPCUA客户端,你可以与KepServer进行交互,获取或控制连接到KepServer的设备或系统的数据。这在设备监控、数据采集和自动化应用中非常常见。 5. 测试过程:通讯测试通常涉及以下步骤: - 安装和配置OPCServer(如KepServer)。 - 运行客户端程序,配置OPCServer的连接参数,包括地址、端口、认证信息等。 - 使用客户端发现OPCServer上的可用服务和数据节点。 - 测试读写操作,验证数据传输的正确性和实时性。 - 可能还包括性能测试,检查数据刷新速率和网络负载。 6. 遵循OPCUA标准:OPCUA提供了丰富的API和SDK,允许开发者创建符合标准的客户端和服务器应用。在实现OPCUA通讯时,必须遵循OPCUA的信息模型和接口定义,确保与其他OPCUA兼容设备的互操作性。 7. 安全性考虑:OPCUA内置了安全机制,如身份验证、授权和加密。客户端和服务器间的通信应配置适当的安全策略,以防止未授权访问和数据泄露。 通过这个压缩包,用户可以学习和实践如何建立和测试OPCUA客户端与OPCServer之间的通讯,这对于理解和开发基于OPCUA的工业自动化解决方案至关重要。同时,对于那些需要集成不同设备或系统的项目,了解并掌握OPCUA技术是非常有价值的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值