大连网站建设哪家专业,做脚本的网站,如何知道wordpress,网页版qq登陆登录题目描述#xff1a; 你要按照顺序以此经过n个商店#xff0c;每到达一个商店你可以购买一件物品#xff0c;也可以出售你手中的商品。 同一时刻你手上最多拿一件商品。在第i个商店购买和出售的代价都是a[i]。 问你经过完n个商店后的最大收益。 同时#xff0c;在最大化收… 题目描述 你要按照顺序以此经过n个商店每到达一个商店你可以购买一件物品也可以出售你手中的商品。 同一时刻你手上最多拿一件商品。在第i个商店购买和出售的代价都是a[i]。 问你经过完n个商店后的最大收益。 同时在最大化收益的前提下求最小的交易次数。 题目分析 不难发现要想使得利益最大我们肯定是要在一个单调区域中的最小值中购入再从该单调区域的最大值时转出。倘若发现了这个事实则我们就可以将题目转化为一个判断两个单调区间的拐点为极大值还是极小值。具体判断方法就是将某个点与之前一个和后一个点比较 倘若我们发现此时位于极小值则我们需要更新价格最小cur。而当我们发现此时位置处于极大值则更新最大利益sum当前价格-最小价格并将最小价格赋为-1代表没有最便宜的物品。 而当我们取到最后一个点时我们需要特判一下如果当前是极大值点亦或者 当前不是极大值点但拿了一个物品则进行更新。 值得留意的是如果遇到连续相同的价格的时候如数列[1,2,2,3,4]中的[2,2]因为此时这些连续的价格对结果没有影响甚至会阻碍我们的判断因此我们考虑将这些连续相同的点去重。 #include bits/stdc.h
#define maxn 100005
using namespace std;
typedef long long ll;
ll a[maxn];
ll tmp[maxn];
int main()
{int t;scanf(%d,t);while(t--){int n;scanf(%d,n);for(int i1;in;i){scanf(%lld,tmp[i]);}int cnt0;for(int i1;in;i){//去重if(i1){a[cnt]tmp[i];continue;}if(tmp[i]!tmp[i-1]){a[cnt]tmp[i];}}ll cur-1;ll sum0,num0;for(int i1;icnt;i){if(i1){if(a[i]a[i1]) cura[i];continue;}if(in){if(a[i]a[i-1]) suma[i]-cur,num2;else if(cur0) suma[i]-cur,num2;continue;}if(a[i]a[i-1]a[i]a[i1]){//当前处于极大值suma[i]-cur,num2;cur-1;}else if(a[i]a[i-1]a[i]a[i1]){//当前处于极小值cura[i];}}coutsum numendl;}
}转载于:https://www.cnblogs.com/Chen-Jr/p/11007265.html