[AtCoder ABC47] An Invisible Hand(简单思维)

题目大意:

有两个商人,暂且定为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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值