题目链接:
分析:
将每个商品的原价减去促销价,得到每件商品能省的钱的数组,那么问题就转化成求最大连续子序列和。
解法:
动态规划
代码:
解法一:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll n,x;
ll maxn;
ll a[N],pre[N],dp[N];
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]-=x;
a[i]+=a[i-1];
}
//前缀和数组
pre[1]=a[1];
//初始化第一位
for(int i=1;i<=n;i++){
if(pre[i-1]<=a[i]) pre[i]=pre[i-1];
else pre[i]=a[i];
}
// for(int i=1;i<=n;i++){
// cout<<pre[i]<<"\t";
// }
// cout<<endl;
// for(int i=1;i<=n;i++){
// cout<<a[i]<<"\t";
// }
// cout<<endl;
for(int i=1;i<=n;i++){
maxn=max(maxn,a[i]-pre[i]);
}
cout<<maxn<<endl;
return 0;
}
解法二:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll n,x;
ll maxn;
ll a[N],pre[N],dp[N];
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]-=x;
}
//前缀和数组
for(int i=1;i<=n;i++){
dp[i]=max(a[i],dp[i-1]+a[i]);
}
for(int i=1;i<=n;i++){
maxn=max(maxn,dp[i]);
}
cout<<maxn<<endl;
return 0;
}