首页 > 其他分享 >CF1400E Clear the Multiset 题解 贪心+分治

CF1400E Clear the Multiset 题解 贪心+分治

时间:2023-01-31 17:23:39浏览次数:62  
标签:CF1400E le int 题解 Clear ge 区间 操作

题目链接:http://codeforces.com/problemset/problem/1400/E

题目大意:

给定一个长度为\(n\)数列\(\{a_n\}\),你可以进行如下操作:

  • 操作1:任意选择一个区间 \([l,r]\),使区间内的每一个数减 \(1\);
  • 操作2:任意选择一个点 \(p\) 和一个正整数 \(x(x \ge 1)\),使 \(a_p\) 减去 \(x\) 。

求把原数列全部变为\(0\)的最少的操作次数。

\(1\le n\le 5000\),\(0\le a_i\le 10^9\)。

解题思路

如果不选择操作1,只选择操作2,则 \(r - l + 1\) 次操作2就能够把所有数都清零。

如果执行操作1,则需要终点考虑一下。

当执行至少一次操作1的时候

首先,对于一个区间 \([l, r]\),只有满足所有元素都 \(\ge 1\) 时才能执行操作1。

其次,如果这个区间在执行若干次操作1后,所有的数字都仍然 \(\ge 1\),则其实没有带来任何效果。

所以操作1必然导致 —— 区间内最小的数字(假设为原先值为 \(x\))变为了 \(0\)。\(\Rightarrow\) 很明显需要进行 \(x\) 次操作。

进行完操作后就又变成了(至少)两个部分。假设原先的最小值 \(x\) 对应的下标为 \(p\),则区间变成了两部分 \([l, p-1]\) 和 \(p+1, r\),然后就可以对两个子区间再进行同样的操作。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5050;
int n, a[maxn];

int dfs(int l, int r) {
    if (l > r) return 0;
    int p = l;
    for (int i = l+1; i <= r; i++)
        if (a[i] < a[p])
            p = i;
    int x = a[p];
    if (x)
        for (int i = l; i <= r; i++) a[i] -= x;
    return min(r-l+1, dfs(l, p-1) + dfs(p+1, r) + x);
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    cout << dfs(1, n) << endl;
    return 0;
}

标签:CF1400E,le,int,题解,Clear,ge,区间,操作
From: https://www.cnblogs.com/quanjun/p/17079878.html

相关文章

  • P6327 区间加区间sin和 题解
    P6327区间加区间sin和题解第一道Ynoi(捂脸题目描述给出一个长度为\(n\)的整数序列\(a_1,a_2,\ldots,a_n\),进行\(m\)次操作,操作分为两类。操作\(1\):给出\(l,r,v......
  • [SDOI2008] 仪仗队【题解】
    题目描述作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的\(N\timesN\)的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所......
  • Luogu P4145 上帝造题的七分钟 2 / 花神游历各国 题解
    Luogu链接:上帝造题的七分钟2/花神游历各国${\scr\color{Orchid}{\text{Solution}}}$题目大意支持两种操作:区间开方(向下取整)区间求和分析发现线段树容易实......
  • AT dp 26 题 题解
    题单:https://www.luogu.com.cn/training/100578#problems嘛虽然是26题,但是简单的题就不想写了...就写绿题及以上的吧目录EIJMOPQRSTUVE对重量dp,设\(dp[i][v]\)表......
  • uniapp webview中动态设置公众号文章标题不显示问题解决
    设置在onLoad中可能会引起偶发性无效。解决方案:1、改写在onReady生命周期中。2、用setTimeout设置延迟。 onReady(){this.timers=setTimeout(()=>{......
  • USACO2023 Bronze 题解
    Problem1.Leaders\(\mathcal{Farmer\John}\)共有\(n\)头奶牛,品种用字符\(\mathsf{G}\)或\(\mathsf{H}\)表示。每一头牛有一个管辖区间\([i,E_i]\)称一头......
  • 算法:线段树&&Luogu p3372题解
    前言不愧是线段树,竟然卡我这么久,还是那句话:十年OI一场空,不开longlong见祖宗#1什么是线段树?线段树长什么样?通俗一点,线段树就是线段,树。实际上,线段树是一棵完全......
  • CF1067E 题解
    题意传送门给定一棵\(n\)个节点的树,每条边有\(\frac{1}{2}\)的概率出现,可以得到一个森林,求这个森林邻接矩阵的秩的期望。\(1\len\le5\times10^5\)。题解此题关键......
  • [AHOI2022] 山河重整 题解
    T3,一个不错的数学题,给了不少的暴力分。Statement求有多少值域为\([1,n]\)的集合,01背包可以凑出\(1\simn\)中的所有数字。Subtask\(1\sim6\)我们从小到大选择每......
  • 微信小程序-【转发好友】以及中文标题乱码问题解决
    微信小程序的转发功能,参考官方文档,使用的buttom的open-type功能,下面是转发功能的具体实现。//通过按钮的open-type="share"实现转发,触发onShareAppMessage函数<butto......