专栏文章

题解:P13095 炒股高手

P13095题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioyxo1l
此快照首次捕获于
2025/12/03 03:25
3 个月前
此快照最后确认于
2025/12/03 03:25
3 个月前
查看原文

题目:

对于每一份“鸡债” 计算其在 [si,ti][s_{i},t_{i}] 内最大收益。

思路:

由于我们可以无限次的买卖,所以就可贪心一下,最优策略是在每一个价格上升的相邻两天(即 ai<ai+1a_{i}<a_{i+1})进行买入和卖出。
这样,总收益倍数等于所有上升段的收益倍数的乘积。这样对于对对数就是直接相加减(对数运算:底数相乘等于指数相加)。

Code

CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
inline void read(int &a){
	char ch;int f=1,k=0;ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
	a=k*f;
}
int a[N],pre[N],n,m,k,s[N],t[N];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	read(n),read(m);
	for(int i=1;i<=n;i++){
		read(a[i]);
		pre[i]=pre[i-1];
		if(i>=2 and a[i]>a[i-1])
			pre[i]+=a[i]-a[i-1];
	}
	read(k);
	for(int i=1;i<=m;i++){
		read(s[i]),read(t[i]);
		cout<<k+pre[t[i]]-pre[s[i]]<<"\n";
	}
	return 0;
}

题解到此就结束了!祝各位 OIer 学有所成。

评论

0 条评论,欢迎与作者交流。

正在加载评论...