题目传送门(内部题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. GMS认证测试FQA

    ---摘要 本文档用于收录GMS认证测试的异常问题,提供一般性指导.对于本文档中未提供解答的问题请咨询@开发经理或@领域技术专家 cts测试工具如何获取? A:见Google官网 https://so ...

  2. js导入外部文件

  3. 安卓手机作为中继器-连接Wifi共享该Wifi给PC和手机

    工具 routernet.apk

  4. JavaScript 开发的 睡眠状况自测(SRSS)

    Javascript 开发睡眠状况自测程序,手记!2019.11.13日... <script>//初始化fbox = new Findpair('fbox','output');fbox ...

  5. jquery点击切换在点击切换

    <div style=" position: absolute; top: 6rem; right: 4rem;" id="hides" > < ...

  6. CentOS7 开机启动流程

  7. webpack基本介绍及使用

    1.什么是webpack webpack是一个前端资源加载/打包工具.它根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 官网地址:https://www.webpac ...

  8. Java缓存Ehcache-Ehcache的Cache在SSM框架中的配置

    需要在Spring配置文件中配置: <!-- 配置缓存管理器工厂 --> <bean id="cacheManager" class="org.spri ...

  9. iOS App中 使用 OpenSSL 库

    转自:http://blog.csdn.net/kmyhy/article/details/6534067 在你的 iOS App中 使用 OpenSSL 库 ——译自x2on的“Tutorial: ...

  10. 朴素贝叶斯算法——实现新闻分类(Sklearn实现)

    1.朴素贝叶斯实现新闻分类的步骤 (1)提供文本文件,即数据集下载 (2)准备数据 将数据集划分为训练集和测试集:使用jieba模块进行分词,词频统计,停用词过滤,文本特征提取,将文本数据向量化 停用 ...