abc047d

https://atcoder.jp/contests/abc047/tasks/arc063_b

// https://atcoder.jp/contests/abc047/tasks/arc063_b
// 最大利润 : 仅在一个点买入最多, 在另一个点全部卖出; 使得两个点间的价值差最大
// 求出这个最大的价值差, 以及能够产生这个价值差的买入点 (可能有多个, 这里设为num个)
// 则答案即为 num, 将这num个买入点的价格都 +1
// 注意: 买入点与卖出点是成对的, 因而不改变买入点而改变卖出点的价格, 操作代价不会更优

#include <iostream>
#include <algorithm>

using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[N];  // 输入
int b[N];  // i+1 ~ n 的 a 的最大值
int c[N];  // b[i] - a[i]

void solv()
{
    int n, t;
    cin >> n >> t;
    for (int i = 1; i <= n; i ++) cin >> a[i];

    // 增加最小值
    int maxc = 0;
    for (int i = n; i >= 1; i --) 
    {
        b[i] = max(b[i + 1], a[i + 1]);
        c[i] = b[i] - a[i];
        maxc = max(maxc, c[i]);
    }
    int ans1 = 0;
    for (int i = 1; i <= n; i ++) if (c[i] == maxc) ans1 ++;

    // // 减小最大值
    // maxc = 0;
    // a[0] = b[0] = 2e9;
    // for (int i = 1; i <= n; i ++)
    // {
    //     b[i] = min(b[i - 1], a[i - 1]);
    //     c[i] = a[i] - b[i];
    //     maxc = max(maxc, c[i]);
    // }       
    // int ans2 = 0;
    // for (int i = 1; i <= n; i ++) if (c[i] == maxc) ans2 ++;
    // cout << min(ans1, ans2) << endl;
    cout << ans1 << endl;
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T --)
    {
        solv();
    }
    return 0;
}
posted @   O2iginal  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示