题解 SP8284 WEIGHT - Weighted Sum

Randolph68706 2019-08-05 原文

题解 SP8284 WEIGHT – Weighted Sum

SP8284 WEIGHT – Weighted Sum

题意描述

给出长度为n(n<=1e6)的序列A, A中元素可能为正数,可为负数或0,。让你构造一个长度为n的序列W,给这些整数A赋权,使它们的加权和最大化。权重W应满足以下条件:

  • 每个权重都应该是一个正整数。(W中每个元素都是正数)

  • W[1]=1

  • 对于i>1,W[i]应在范围[2,W[i-1]+1]内。(
    W[i] ∈[2,W[i-1]+1] (i>1))

让你构造一个满足这样条件的序列W, 使得ΣA[i]×W[i]最大

输入格式

有多组数据。

第一行数据组数

每组数据第一行为n,后面是n行,每行一个A[i]

输出格式

对于每组数据,输出一行最大加权和;

输入样例

1
4
1
2
3
-4

输出样例

6

翻译:So_what

分析(by Chelly)

简单地分析下W数组的性质

对于那些负数A[i], 为了让总和最大, 我们肯定希望W[i]越小越好, 2是最好的。

对于连续的一串正数A[l..r], 我们肯定希望W[l..r]越大越好, 那么肯定是依次是2 3 4 5 6 … r-l+2

那么是不是对于每个负数A[i], 对应的W[i]就是2; 对应连续的一串正数, W[i]就是2 3 4 5…..这样呢?

看这样的例子: A[4]={-1,-2,2,10000} 那么W[4]={2,3,4,5}比W[4]={2,2,3,4}更优

我们考虑一串A[l..r], 假设目前的W是2 3 4 5 6….

那么现在的问题的就是对于前面一个A[l-1], 我们究竟要不要将2从W[l-1]开始, 后面的W[l..r]改成3 4 5 6….

注意到如果这样更改, 那么实际上[l,r]对总结果的贡献改变了sum[l..r]

我们肯定希望改变值sum[l..r]是正的

从A序列尾部r向前扫描, 直到扫到一个位置l, sum[l..r]<0, 那么这段位置的W值就依次是2 3 4 5 6 7 ….

将l-1作为新的r往前继续扫描, 直到扫描完整个A序列

为了满足时间复杂度, 需要高效地统计答案

往前扫的过程中, 我们可以假定当前位置是2, 得到目前的ans, 然后如果判定可以向前移动一位, 那么相当于这些位置的W都对应加1, 对于总的结果来说, 就是加上这一段的sum

时间复杂度O(n)

#include<cstdio>
using namespace std;
int T,n,a[1000005];
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        for (int i=1; i<=n; i++) scanf("%d",&a[i]);
        long long ans=0,s=0,sum=0;//ans最大权值和,s当前段的最大权值和,sum当前段的A[]后缀和
        for (int i=n; i; i--) {
            sum+=a[i];
            s+=sum+a[i];//给s+=sum相当于把sum中每个数增加一倍(权值和为正),每个A至少×2,所以s加上两次a[i]
            if (sum<0 || i==1) {
                if (i==1) s-=sum;//W[1]=1
                ans+=s,s=sum=0;//若后缀和变为0,则w[i]取最小2,sum清零
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
发表于 2019-08-05 10:49 Randolph、 阅读() 评论() 编辑 收藏

 

版权声明:本文为Randolph68706原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Randolph68706/p/11301646.html

题解 SP8284 WEIGHT - Weighted Sum的更多相关文章

  1. 华为软件开发云发布管理测评报告 – 老鱼大哥

    华为软件开发云发布管理测评报告 2017-07-12 15:44  老鱼大哥  阅读(366)  评论(0)  […]...

  2. [转]免费开源.net网上商城 – freeliver54

    [转]免费开源.net网上商城 本文转自:http://hi.baidu.com/lisky119/item/ […]...

  3. 电路驱动能力(引用) – Red_Point

    电路驱动能力(引用) ---------------一网友提问 1.在电子电路中为什么有的地方电压会被拉低2, […]...

  4. 电脑办公Windows 7 + Office 2013入门与提高 超值版

    电脑办公Windows 7 + Office 2013入门与提高 超值版 1 电脑办公基础 1.1 认识电脑办 […]...

  5. 数据仓库建模与ETL实践技巧 – ~handsome

    数据仓库建模与ETL实践技巧 一、数据仓库的架构 数据仓库(Data Warehouse DW)是为了便于多维 […]...

  6. C语言的## – eustoma

    C语言的## 比如说我定义一个宏:#define DECLARE_DYNAMIC(class_name) \p […]...

  7. MPU6050 – Darren_pty

    MPU6050 MPU6050: Pitch,Roll,Yaw旋转方向遵循右手定则 pith角  –绕Y轴(俯 […]...

  8. vscode复制粘贴以后变成粗光标、下划线无法输入 – 浅时光吖~

    vscode复制粘贴以后变成粗光标、下划线无法输入     作为ctr c + ctr v 搬砖的,这效率气死 […]...

随机推荐

  1. 从”UDF不应有状态” 切入来剖析Flink SQL代码生成

    “Flink SQL UDF不应有状态” 这个技术细节可能有些朋友已经知道了。但是为什 […]...

  2. linux

    查看磁盘空间使用情况df -h查看文件夹空间占用情况du -sh *查看进程和线程方法一:PS在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为的进程创建的所有线程。方法二: Toptop命令可...

  3. 解决Webstorm Nodejs console.log("这是中文") 控制台乱码

    设置文件编码自定义vm选项文件添加 文件最后一行添加 -Dfile.encoding=UTF-83.修改注册表Windows+R --> regedit --> 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Micro...

  4. 智慧物流:AIOT时代来临,如何打通物流“最后一公里”?

    平台融合了AI、大数据、物联网、5G等技术,拥有强大的数据融合、处理及分析能力,将物流的每一个节点汇聚到一起, […]...

  5. 在b站做计网实验

    在b站做计网实验 – 抓包/get/post 前言 这篇博文是一个小实验,用python发送get […]...

  6. 【微服务学习】微服务架构实践

    目录 业务背景微服务概念微服务技术选型微服务架构设计微服务架构设计落地微服务架构设计过程中积累的心得总结 一、 […]...

  7. 一个简单的URL访问权限校验

      前言   目前最流行的两大安全框架:SpringSecruity、Shiro   权限控制,无非就是:前端 […]...

  8. 数据结构之二叉树解析

    曾经有个朋友问我:二叉树可以用来干啥况? 我回答他:可以搜索、可以排序呀? 可是,排序有快速排序,归并排序,查 […]...

展开目录

目录导航