[题解]P2672 [NOIP2015 普及组] 推销员

news/2024/9/8 10:34:24/文章来源:https://www.cnblogs.com/Sinktank/p/18326850

P2672 [NOIP2015 普及组] 推销员

为了便于操作,将住户信息按疲劳值从大到小排序。

那么对于选\(X\)个住户,有\(2\)种情况:

  • 选疲劳值前\(X\)大的住户,答案即为\(\sum\limits_{i=1}^X a[i] + 2\times \max\limits_{i=1}^X s[i]\)
  • 选疲劳值前\(X-1\)大的住户,然后在剩下的住户中,距离比前\(X-1\)个住户都远的住户里面选出一个住户\(k\),使得\(2\times s[k]+a[k]\)最大,答案即为\(\sum\limits_{i=1}^{X-1} a[i]+(a[k]+2\times s[k])\)

    为什么要限制\(k\)必须比其他\(X-1\)个住户都远呢?
    其实不限制是没有影响的,不过如果\(k\)在前\(X-1\)个住户前边的话,答案显然不会比第\(1\)种情况优,为了更清晰就不参与考虑了。

为什么不考虑选疲劳值前\(X-2\)大,然后在剩下住户中选前\(2\)大?
假设我们选的\(2\)个是\(k\)\(l\)(不妨设\(l\)距离更大),那么此时的答案就是\(\sum\limits_{i=1}^{X-2} a[i]+(a[k]+a[l]+2\times s[l])\),还不如不选\(k\)呢。

\(X-3\)等情况同理。

为了更清晰地理解,把两种情况画出关系图来,大概是这样:

两者包含了所有情况,所以正确性能得到保证。

代码实现上,对于每个\(X\),把上面\(2\)中情况取最大值即可。注意要用前缀和&最大值数组提前维护,否则会超时。

\(2\)种情况虽然说限制\(k\)必须更远,但代码不必特意去判断,主要是因为上面已经分析了,就算不限制答案也不会有影响,所以\(k\)就取\([X,n]\),取最大值即可(需要后缀最大值数组维护,否则会超时)。

点击查看代码
#include<bits/stdc++.h>
#define N 100010
#define int long long
using namespace std;
struct house{int s,a;}a[N];
int n,sum[N],maxdis[N],maxx[N];
signed main(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i].s;for(int i=1;i<=n;i++) cin>>a[i].a;sort(a+1,a+1+n,[](house a,house b){return a.a>b.a;});for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].a;for(int i=1;i<=n;i++)maxdis[i]=max(maxdis[i-1],a[i].s);for(int i=n;i>=1;i--)maxx[i]=max(maxx[i+1],2*a[i].s+a[i].a);for(int i=1;i<=n;i++)cout<<max(sum[i]+2*maxdis[i],sum[i-1]+maxx[i])<<"\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772624.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LockSupport

LockSupprot 用来阻塞和唤醒线程,底层实现依赖于 Unsafe 类(后面会细讲)。 该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕 park 和 unpark 展开。 public class Main {public static void main(String[] args) {Thread mainThread = Thread.currentThread(…

计算机组成与体系结构-浮点数表示

定点数: 是一种在计算机中表示和处理实数的方法,其中,小数点的位置是固定的,不会随着数值的大小而变化。浮点数: 是计算机中用于表示实数的一种数据类型。小数点 位置浮动浮点数表示阶码(指数部分): 决定了浮点数可以表示的范围。阶码越长,可以表示的指数范围就越大 尾数(有…

渗透

渗透测试 一、简介 ​ 渗透测试(Penetration Testing)是一种通过模拟攻击的技术与方法,挫败目标系统的安全控制措施并获得控制访问权的安全测试方法。 ​ 网络渗透测试主要依据CVE(Common Vulnerabilities and Exposures,通用漏洞与披露)已经发现的安全漏洞,模拟入侵者的攻击…

学习Java的第四周

第四周的学习记录来喽,本周的重点就是之前提到过的判断和循环(其中包括流程控制语句的三种结构:顺序、分支、循环;顺序结构即Java程序的默认流程,分支结构学了if判断语句的三种格式、switch语句练习和扩展知识,循环结构学了for循环格式和练习、累加思想和统计思想、while…

idea在pom中引入第三方依赖

项目右侧点击maven,点击加号(鼠标放上去会出现add maven project字样) 找到要导入的项目的pom文件选中,ok(这里我以及导入过了,所以ok是灰色) 回到原项目中,在pom中添加dependency 其中,artifactId是导入进来的姓名的名字,groupId是导入进来的项目的java目录下的包名…

计算机组成与体系结构-cache

概念 Cache,高速缓冲存储器。是解决CPU与主存之间速度不匹配而采用的一项重要技术,位于主存与CPU之间,由静态存储芯片(SRAM)组成,容量比较小,Cache存储了频繁访问的内存数据命中率 CPU欲访问的信息已在Cache中的比率,设在一段程序执行期间cache完成存取次数为NC,主存完成…

《Programming from the Ground Up》阅读笔记:p88-p94

《Programming from the Ground Up》学习第5天,p88-p94总结,总计7页。 一、技术总结 1.touppercase.s #PURPOSE: This program converts an input file #to an output file with all letters #converted to uppercase.#PROCESSING: #(1)Open the input file #(2)Open the o…

计算机网络第三讲 数据链路层

计算机网络第三讲 数据链路层 第一节:数据链路层功能 1. 概述2. 数据链路层的功能封装成帧透明传输差错控制实现无比特差错 不是可靠传输 丢失,乱序,重复无法解决

计算机组成与体系结构-层次化存储体系

将数据分为多个层次进行存储,以最优的控制调度算法和合理的成本,构成具有性能可接受的存储系统. 解决两个矛盾采用层次化存储体系,可以通过平衡存储介质的速度和成本得到最佳的存储效用。解决了主存容量不足与高成本的矛盾、CPU与主存速度不匹配的矛盾存储器分类RAM,随机存…

计算机网络第一讲

计算机网络第一讲 计算机网络概述考点一 1. 计算机网络的定义2. 计算机网络的组成物理组成工作方式英特网中的服务 考研中只有 TCP是可靠服务,其他都是不可靠的 面向连接的服务只有1.TCP 2.PPP 其他所有均无连接有应答服务:1.TCP 2.CSMA/CA3. 计算机网络的特点 共享4. 计算机…

计算机组成原理基础第7讲 输入输出系统

计算机组成原理基础第7讲 输入输出系统2. 输入输出系统的组成考点二:I/O接口接口的功能和组成I/O接口的基本组成3. 接口类型4. 程序查询方式考点三:中断系统