题目大意:
有两个商人,暂且定为A,B。现在有N个城市,商人A从1号城市依次旅行到N号城市,每个城市都有买卖苹果的,但是每个城市的价格可能不一样。商人A有T次买卖的机会(买与卖均算一次)。商人A会把从前面买来的苹果在后面的城市高价卖出,赚取差价。而商人B就比较可恶,商人B可以改变任意一个城市苹果买卖价格。问:商人B操作几个城市的苹果价格会让商人A少赚钱,(少赚1块就算赚)。
思路:
对于A来说,最优方案当然在前面以最小的价格买尽可能多的苹果,然后再后面的城市以高价卖出去。
比如 2 5 3 4 1 最优解是在1号买入,2号就卖出。对于B来说我只要改变1号或者2号其中一个城市的价格就可以了,3 5 3 4 1 或者2 4 3 4 1。
所以,总的思路是,先扫一遍找到差距最大的两个城市的利润。显然,这一定是前面小,后面大。然后在扫一遍找到利润相同的有多少个。最后输出。
最后不难发现,T至始至终都没啥用处,只是为了方便理解题意而已。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
const int inf=0x3f3f3f3f;
int a[100005];
int main()
{
ios::sync_with_stdio(false);
int n,t;cin>>n>>t;
int mx,mn;t=0;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(i==0) mn=a[i];
mn=min(mn,a[i]);
//t就是利润,再次利用没用变量。最大差值一定在(当前值)-(前面历遍的最小值)里
t=max(t,a[i]-mn);
}
for(int i=0;i<n;i++)
{
if(i==0) mn=a[i];
mn=min(mn,a[i]);
if(a[i]-mn==t) sum++;
}
cout<<sum<<endl;
return 0;
}