首页 > 其他分享 >CF1898 B Milena and Admirer 题解

CF1898 B Milena and Admirer 题解

时间:2023-11-20 16:55:46浏览次数:41  
标签:ch last Milena int 题解 ret CF1898 操作

Link

CF1898 B Milena and Admirer

Question

给出一个长度为 \(n\) 的序列 \(a\) ,我们可以做一种操作使得 \(a\) 非降,操作是:

  • 对于一个 \(a_i\) 选择一个整数 \(0 \le x \le a_i\) ,用两个数 \(x,(a_i-x)\) 来替换 \(a_i\)。

求最小操作次数。

Solution

考虑哪些数是需要操作的,如果 \(a_i\) 比后面一个数大,那么这个数肯定需要进行操作来减小 \(a_i\)。

再思考对于一个数 \(a_i\) 需要怎么操作,定义后面一个数在操作后的最小值是 \(last\) ,那么 \(a_i\) 在操作后的最大值肯定不大于 \(last\) ,贪心的想法,操作次数越少越好,操作次数就是 \(K=\lceil a_i/last \rceil-1\),操作后,我们肯定希望 \(a_i\) 生成的数的最小值越大越好,再贪心的想法,最大的最小值就是 \(\lfloor a_i/(K+1) \rfloor\) 。

那么从后往前处理,记录每个 \(a_i\) 操作的次数以及更新 \(last\)。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+5;
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}
int a[maxn];
signed main(){
    // freopen("B.in","r",stdin);
    int T=read();
    while(T--){
        int N=read();
        for(int i=1;i<=N;i++) a[i]=read();
        int num=1,lst=a[N];
        for(int i=N-1;i;i--){
            if(a[i]<=lst){num+=1;lst=a[i];continue;}
            int K=a[i]/lst+(a[i]%lst!=0);
            lst=a[i]/K;
            num+=K;
        }
        printf("%lld\n",num-N);
    }
    return 0;
}

标签:ch,last,Milena,int,题解,ret,CF1898,操作
From: https://www.cnblogs.com/martian148/p/17844328.html

相关文章

  • CF1899 G Unusual Entertainment 题解
    LinkCF1899GUnusualEntertainmentQuestion给出一个排列\(p_i\)和一棵树,给出\(Q\)组询问,每组询问\([L,R,x]\)表示求\(p_L\simp_R\)上是否存在\(p_i\)在\(x\)的字数上。Solution这道题确实是一个好题。我们先考虑一个问题,怎么样才能判断子树,我们给书上的每个......
  • Windows端口占用问题解决
    查询被占用的端口进程8080为端口号netstat-ano|findstr8080杀掉线程14816为进程号taskkill/f/t/im14816......
  • noip2023 题解(民间数据)
    P9868[NOIP2023]词典(民间)直接把每个串\(w_i\)都从大到小/从小到大排一下,记作\(a_i,b_i\)。如果\(b_i\)小于除了\(i\)之外的所有\(a_i\),说明可以,否则不行。求一个前后缀最大值即可。复杂度\(\mathcal{O}(26n+nm)\)。点击查看代码#include<bits/stdc++.h>usingname......
  • CF1898D - Absolute Beauty(绝对值)
    题目地址Solution考虑把\(|a_i-b_i|\)转化为数轴上的线段的一条线段,那么\(swap\)操作可以形象转化为下图(借用官方\(Editoral\))考虑最大的增加(第一张图的情况)即可。Summary学到了绝对值转线段,把指定操作形象化,数形结合(雾......
  • 【洛谷 P1125】[NOIP2008 提高组] 笨小猴 题解(字符串+映射+集合)
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设是单词中出现次数最多的字母的出现次数,是单词中出现次数最少的字母的出现次数,......
  • [ABC326C] Peak 题解
    题目链接题目思路这个问题要求找到一个半开区间,使得在这个区间内包含尽可能多的礼物。首先,我们需要将输入的礼物坐标按照从小到大的顺序进行排序。然后,我们可以使用双指针的方法来寻找最佳的区间。代码以下是代码解释:#include<bits/stdc++.h>usingnamespacestd;constint......
  • [ABC328C] Consecutive 题解
    HelloWorld链接这道题是一个很明显的前缀和,我们把$sum_i$表示为前$i$个字符有多少个有重复,查询的时候就用$sum_{r-1}-sum_{l-1}$就行了。代码#include<bits/stdc++.h>usingnamespacestd;strings;intsum[300010];intmain(){ intn,q; cin>>n>>q>>s; for(in......
  • CF222A Shooshuns and Sequence 题解
    分析这题是一个很水的题,就是对一个序列有$2$种操作方法,一种是对第$K$个数以前的数的第一个进行删除,另一个则是在整个序列后添加这第$K$个数,使得整个序列为同一个数字,显然,后者是无效操作,则只需要判断第$K$个数以后有无与第$K$个不同的数,有则无解,反之有解。若有解,然后再......
  • CF601B Lipshitz Sequence 题解
    给你一个序列\(v_{1\dotsn}\),定义\(f(v)\)为\(v\)中斜率最大值(\(\lvertv\rvert=1\)则\(f(v)=0\)),有\(q\)组询问,每次给定\(1\lel\ltr\len\),求\(a_{l\dotsr}\)的每个子区间的\(f\)之和。一个关键的性质是,最大的斜率只在相邻数间取到。有了这个性质,这题......
  • NEFU OJ Problem 1489 青蛙赶路 题解【动态规划DP】
    Problem:GTimeLimit:2000msMemoryLimit:65535KDescription有一只青蛙,每秒选择走1米或跳m米,青蛙体力不足,所以不能连续两秒都在跳。青蛙将移动到[l,r]之间,它想知道有多少种不同的方式来实现其目标。两种方式是不同的,当且仅当它们移动不同的米或花费不同的秒,或者是在一秒......