题目传送门(内部题62)


输入格式

第一行有一个整数$n$。
第二行有$N$个整数:$a_1\ a_2\ a_3\cdot\cdot\cdot a_n$。


输出格式

一行一个整数表示最大收益。


样例

样例输入:

5
1 1 5 3 6

样例输出:

9


数据范围与提示

样例解释:

第$1,2$天分别买入一件货物,第$3,5$天分别卖出一件货物,第$4$天不进行交易。

$-1-1+5+6=9$。

数据范围:

对于所有数据,$n\leqslant 10^5$,$0\leqslant a_i\leqslant 10^6$。


题解

一个很显然的问题,最后一定是要把所有买的物品卖光。

那么,我们先来考虑$DP$,设$dp[i][j]$表示到了第$i$天,手里有$j$个物品的最大收益即可。

则转移方程为:

$$dp[i][j]=\max(dp[i-1][j],dp[i-1][j-1]-a[i],dp[i-1][j+1]+a[i])$$

在来考虑一下$j$上界的问题,因为我们到了第$i$天最多会有$i$件物品,最后还要卖光,所以$j$的区间其实是如下图中红色区域:

考虑这样一个有关考试策略的问题,我们可以将其上界设为$1000$左右,这样对于$70\%$的数据,上界最多会是$500$,然而对于$100\%$的数据我们还有可能过掉,何乐而不为?

用滚动数组即可,还不用清空。

其实上界设成$471$就可以$AC$啦~

现在来考虑正解,当时我以为是线段树优化$DP$,因为那个式子简直太像了!!!

然而这却是一道反悔贪心……

考虑新的一天如果有单价为$b$的货物,之前有单价为$a(a<b)$的货物,那么我们的策略一定是卖$b$买$a$,即$b-a$。
显然,买$a$这个决策在现在和以后一定是最优的,但是$a$与$b$配对并不一定是最优的,以后可能会出现$c(c>b)$,$c−a$才是最优策略。这时,我们就采用可反悔的贪心策略,用小跟堆维护即可。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

$DP$:

#include<bits/stdc++.h>
using namespace std;
int n;
long long dp[2][100001];
long long ans;
bool now;
int main()
{
scanf("%d",&n);
memset(dp,-0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;i++)
{
int a,minn=min(471,min(i,n-i));
scanf("%d",&a);now^=1;
for(int j=0;j<=minn;j++)
{
dp[now][j]=dp[!now][j];
dp[now][j]=max(dp[now][j],dp[!now][j-1]-a);
dp[now][j]=max(dp[now][j],dp[!now][j+1]+a);
}
}
printf("%lld",dp[now][0]);
return 0;
}

反悔贪心:

#include<bits/stdc++.h>
using namespace std;
int n,a;
priority_queue<int,vector<int>,greater<int> > q;
long long ans;
int main()
{
scanf("%d%d",&n,&a);
q.push(a);ans=-a;
for(int i=2;i<=n;i++)
{
scanf("%d",&a);
q.push(a);
ans-=a;
if(q.top()<a)
{
q.push(a);
q.pop();
}
}
while(q.size())
{
ans+=q.top();
q.pop();
}
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:trade(反悔贪心)的更多相关文章

  1. [CSP-S模拟测试]:Blue(贪心)

    题目描述 $Blue$是个动物学家,不仅喜欢研究猫和老鼠,还喜欢研究青蛙.他最近开始研究青蛙过河的问题,可以简化成:数轴上$0$为岸边,$L$为河对岸.$(0,L)$中间存在$n$个石子.已知青蛙一跳 ...

  2. [CSP-S模拟测试]:爬(贪心)

    题目传送门(内部题134) 输入格式 第一行两个数$N,L$. 接下来$N$行每行两个数$A_i,B_i$. 接下来$N$行每行一个整数$C_i$. 输出格式 一行一个整数表示答案,无解输出$-1$. ...

  3. [CSP-S模拟测试]:午餐(贪心+最短路)

    题目传送门(内部题115) 输入格式 第一行两个正整数$n,m$. 接下来$m$行,每行$4$个正整数$u_j,v_j,L_j,R_j$. 接下来一行$n$个数,若第$i$个数为$1$,则$i$号同学 ...

  4. [CSP-S模拟测试]:格式化(贪心)

    题目传送门(内部题105) 输入格式 每组数据第一行一个正整数$n$,表示硬盘块数,接下来$n$行,每行两个正整数,第一个正整数为硬盘格式化前的容量,第二个正整数为格式化之后的容量. 输出格式 对每组 ...

  5. [CSP-S模拟测试]:优化(贪心+DP)

    题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...

  6. [CSP-S模拟测试]:梦境(贪心+小根堆)

    题目描述 智者奥尔曼曾说过:有缘的人即使相隔海角天涯,也会在梦境中相遇. $IcePrince\text{_}1968$和$IcePrincess\text{_}1968$便是如此.有一天$IcePr ...

  7. [CSP-S模拟测试]:d(贪心+树状数组)

    题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对 ...

  8. [CSP-S模拟测试]:Tree(贪心)

    题目描述 给定一颗$n$个点的树,树边带权,试求一个排列$P$,使下式的值最大 $$\sum \limits_{i=1}^{n-1}maxflow(P_i,P_{i+1})$$ 其中$maxflow( ...

  9. [CSP-S模拟测试]:赛(贪心+三分)

    题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k ...

随机推荐

  1. try...catch语句

    程序的异常:Throwable 严重问题Error我们不处理,这种问题一般都是很严重的,比如内存溢出 问题Exception 编译期问题不是RuntimeException的异常必须进行处理,如果不处 ...

  2. 安全测试工具之AppScan(Application)

    AppScan是一款Web应用安全测试工具,也是唯一一个在所有级别应用上提供安全纠正任务的工具.AppScan扫描Web应用的基础架构,进行安全漏洞测试并提供可行的报告和建议.AppScan的扫描能力 ...

  3. HttpServletRequest中的request.setAttribute()和request.getSession().setAttribute()

    request.setAttribute("num",value):有效范围是一个请求范围,不发送请求的界面无法获取到value的值,jsp界面获取使用EL表达式${num}:re ...

  4. fastdfs集群安装过程_学习笔记

    最终效果 初始化为6个节点 在/usr/local/software 目录下上传需要用到tar包,分别在各个节点上传 使用scp 将本地software目录复制到其他节点上 73.74为 tracke ...

  5. idea中gradle的springboot的项目热部署

    1:在build.gradle中添加热部署依赖(我gradle版本是5.5.1) // 添加 热部署依赖implementation 'org.springframework.boot:spring- ...

  6. spring,springMVC的优点和区别

    spring 是是一个开源框架,是为了解决企业应用程序开发,功能如下◆目的:解决企业应用开发的复杂性◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能◆范围:任何Java应用简单 ...

  7. Vue --》 如何在vue中调用百度地图

    1.项目根目录下下载百度地图插件 npm install vue-baidu-map –save 2.在首页index.html中引入百度地图: <script type="text/ ...

  8. python基础-3 集合 三元运算 深浅拷贝 函数 Python作用域

    上节课总结 1 运算符 in 字符串 判断  : “hello” in "asdasfhelloasdfsadf" 列表元素判断:"li" in ['li', ...

  9. The second curriculum design experiment report in spring 2019

    2019年第二次课程设计实验报告 一.实验项目名称 贪吃蛇 二.实验项目功能描述 1.小蛇的移动 玩家可以通过 W A S D控制小蛇的上左下右移动,通过函数改变小蛇部位的位置 2.判断游戏失败 当小 ...

  10. g50打开无线设置 fn+f7