来源:牛客网周赛49
每件商品减去原价即得省去的钱,记录到数组a[i]中。
记sum为前a[1],a[2]...a[i]总和,Min为a[1]到a[m]的和,m<=n,m使得Min最小。
当i从1逐渐增大到n时,sum-Min中的最大值即最大子序列的和。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
signed main()
{
int a[N];
int n,x;
cin>>n>>x;
for(int i=1;i<=n;i++)
{
int m;
cin>>m;
m-=x;
a[i]=m;
}
int ans=0;
int Min=0;
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
Min=min(Min,sum);
ans=max(ans,sum-Min);
}
cout<<ans;
return 0;
}
空间上,还可以优化为O(1)
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int ans=0,sum=0,Min=0;
int n,x,m;
cin>>n>>x;
while(n--)
{
cin>>m;
m-=x;
sum+=m;
Min=min(Min,sum);
ans=max(ans,sum-Min);
}
cout<<ans;
return 0;
}
需要注意的是,本题可以购买任意整数件商品,即当怎么买都不能省钱时,应输出0。
若规定至少买一件,则ans应初始化为a[1]。
7.5