- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
解题思路
这道题目是一个优化问题,目标是在满足购物车中商品数量为偶数的条件下,使得购物车中商品的总价值最大。商品的价格既可以为正,也可以为负。我们需要注意的是,负价的商品并不意味着不能购买,因为购物车中的商品数量必须为偶数,所以在某些情况下,购买负价的商品可能会使得总价值最大。
首先我们需要确定一个贪心策略。显然,优先购买正价的商品可以使得总价值增加。然而,当正价商品的数量为奇数时,我们需要考虑两种情况:一是去掉一个正价商品,二是加入一个负价商品。我们需要在这两种情况中选择一种,使得总价值最大。
具体步骤如下:
初始化变量:我们需要维护以下变量:
sp:购物车中商品的总价值,初始值为0
np:购物车中商品的数量,初始值为0
mn:负价商品的最大值,初始值设为?-10^9-1?109?1(小于题目给出的商品价格范围的最小值)
mp:正价商品的最小值,初始值设为?10^9+1109+1(大于题目给出的商品价格范围的最大值)
遍历商品:遍历每一个商品,对于价格为?el?的商品:
如果?el?0,我们将其加入购物车,即更新?sp?和?np,同时更新?mp。
如果?el?≤0,我们更新?mn。
调整购物车:遍历结束后,如果?np?是奇数,我们需要调整购物车。这时,我们需要在去掉一个正价商品和加入一个负价商品这两种情况中选择一个,使得?sp?最大。具体来说,我们将?sp?更新为?sp-mp?和?sp+mn?的较大值。
输出结果:最后,输出?sp,即购物车中商品的最高总价值。
由上我们便可完成解题。因为我们只需要遍历一次商品列表,所以时间复杂度为?O(N)O(N)。
AC_Code
C++
#includebits/stdc++.h
usingnamespacestd;
#definelllonglong
intmain(){
llsp=0;
intmn=-1e9-1,mp=1e9+1,np=0;
intn;cinn;
for(inti=0;in;i+=1){
intel;cinel;
if(el0){
if(mpel){
mp=el;
}
sp+=el;
np+=1;
}elseif(mnel){
mn=el;
}
}
if(np%2){
sp=max(sp-mp,sp+mn);
}
coutsp\n;
return0;
}
Java
importjava.util.*;
importjava.io.*;
publicclassMain{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
longsp=0;
intmn=(int)-1e9-1,mp=(int)1e9+1,np=0;
intn=sc.nextInt();
for(inti=0;in;i++){
intel=sc.nextInt();
if(el0){
if(mpel){
mp=el;
}
sp+=el;
np+=1;
}elseif(mnel){
mn=el;
}
}
if(np%2!=0){
sp=Math.max(sp-mp,sp+mn);
}
System.out.println(sp);
}
}
Python
n=int(input())
nums=list(map(int,input().split()))
sp=0
mn=-1e9-1
mp=
文档评论(0)