首页 > 其他分享 >CF1902 C Insert and Equalize 题解

CF1902 C Insert and Equalize 题解

时间:2023-12-04 16:24:06浏览次数:51  
标签:ch gcd int 题解 long CF1902 maxn ret Equalize

Link

CF1902 C Insert and Equalize

Question

有一个 \(n\) 个元素的数组 \(a\),每个元素都不一样

现在我们需要在 \(a\) 中添加一个数字 \(a_{n+1}\),和之前的元素都不一样

然后选择一个数 \(x\),可以在一个元素上加 \(x\),为操作一次,(每次加的数都是 \(x\))

求,操作的最少次数

Solution

先不看加的那个 \(a_{n+1}\),那么需要加的数肯定是 \(\gcd (|a[1]-a[2]|,|a[3]-a[2]|,|a[4]-a[3]|) \cdots\)

\[x=\gcd (|a[1]-a[2]|,|a[3]-a[2]|,|a[4]-a[3]|) \cdots \]

可以把 \(a\) 从大到小排序,所以第 \(i\) 个数需要加 \(x\) 的次数是 \((a[1]-a[i])/x\)

再考虑加入的 \(a[n+1]\) ,\(a[n+1]\) 加 \(x\) 的次数肯定越少越好,但也必须要和 \(a[1]\) 的差为 \(x\) 的倍数,所以只需要判断 \((a[1]-a[i])/x\) 的值是否连续。若不连续,那么缺的那个数就是 \(a[n+1]\) 加 \(x\) 的次数

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+5;
typedef long long LL;
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],b[maxn];
int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}
void solve(){
    LL ans=0;
    int N=read();
    for(int i=1;i<=N;i++) a[i]=read();
    if(N==1){printf("1\n");return ;}
    sort(a+1,a+1+N,greater<int>());
    for(int i=1;i<=N;i++) a[i]-=a[N];
    int g=abs(a[2]-a[1]);
    for(int i=3;i<=N;i++){
        g=gcd(g,abs(a[i]-a[i-1]));
    }
    int flg=0;
    for(int i=1;i<=N;i++){
        b[i]=(a[1]-a[i])/g;
        ans+=b[i];
        if(flg==0&&b[i]!=i-1) {
            ans+=i-1;flg=1;
        }
    }
    if(!flg)ans+=N;
    printf("%lld\n",ans);
    return ;
}
signed main(){
    int T=read();
    while(T--) solve();
}

标签:ch,gcd,int,题解,long,CF1902,maxn,ret,Equalize
From: https://www.cnblogs.com/martian148/p/17875249.html

相关文章

  • CF1902 A Binary Imbalance 题解
    LinkCF1902ABinaryImbalanceQuestion给出一个01串,可以在任意一个位置\(i\)插入一个字符,如果\(a_i\nea_{i+1}\)插入的字符为\(0\)否则插入的字符为\(1\)问,是否可以通过任意次操作使得串中\(0\)的数量比\(1\)多Solution如果一个串都为\(0\)肯定符合都......
  • [AGC063C] Add Mod Operations 题解
    题目链接点击打开链接题目解法好难想的构造题!!!到底是怎么想到的???首先无解的条件是好判的,如果有\(i\neqj,\;a_i=a_j\)且\(b_i\neqb_j\),那么就无解将\(a\)从小到大排序考虑下面的构造方式:\(y=curmax+x\),这样可以使最大值清\(0\),其他数都\(+x\),这是一个类似消元的过程,每......
  • CF1902 B Getting Points 题解
    LinkCF1902BGettingPointsQuestionMonocarp的一个学期有\(n\)天,需要修\(P\)个学分,完成一节课程加\(l\)个学费,完成一个任务加\(t\)个学分Monocarp一天可以完成一节课+两个任务任务每周分配一个,也就是day1,day8,day15...问,在可以修满学分的情况下,Monocarp最多休......
  • 湖南省网络攻防邀请赛 RE 题解
    ez_apkk解题过程:将apk拖入jadx,查看MainActivity,发现是简单RC4加密,密钥是“55667788”,最后再将加密结果+1publicStringEncrypt(StringplainText,Stringkey){int[]S=newint[256];byte[]K=newbyte[256];char[]cArr={'\n','+',18......
  • CF1692H Gambling 题解
    题意:思路:考虑离散化:枚举$x$中出现的每一个数$val$,$val$出现的次数为$cnt$,记录$val$每一次出现的索引$idx_i(1\lei\lecnt)$。设$x$中与$val$相等的数贡献为$+1$,与$val$不相等的数贡献为$-1$,那么问题转化为最大连续子段和。由......
  • P1004 [NOIP2000 提高组] 方格取数 题解
    题意:思路:考虑四维$dp$:设$dp[i][j][k][l]$表示两条路径分别走到$(i,j)$和$(k,l)$时所能获取的最大和,显然会超时。考虑三维$dp$:设$dp[i][j][k]$表示两条路径走了$i$步分别走到第$j$行和第$k$行时所能获取的最大和,通过当前步数$i$以及当......
  • vue 编辑器+使用场景+问题解决
    vue编辑器组件添加依赖"dependencies":{"@codemirror/autocomplete":"^6.4.2","@codemirror/commands":"^6.2.1","@codemirror/lang-javascript":"^6.0.2","@codemirror/lan......
  • SP1716 GSS3 - Can you answer these queries III 题解
    题意:给定一个长度为$n$的序列$a$,$q$次操作,每次操作为以下之一:\(0\)\(x\)\(y\):将\(a_x\)修改为\(y\)\(1\)\(l\)\(r\):询问区间\([l,r]\)的最大连续子序列和思路:考虑线段树维护区间最大连续子序列和:线段树每个节点需要维护的信息:区间左端点$l$,区......
  • P3214 [HNOI2011] 卡农 题解
    Description给定\(n,m\),要从\(1,2,\dots,2^n-1\)中选\(m\)个无序的数,使得他们互不相同且异或和为\(0\),问有多少种选法。对\(998244353\)取模。Solution考虑求出有序的方案数的个数再除以\(m!\)。设\(f_i\)表示选出\(i\)个数的方案。那么如果随便选前\(i-1\)......
  • ABC331G题解
    ABC331G日常被bot吊打罢了。首先注意到一件事是你需要求一堆max的期望对吧。所以其实上来就应该试试上min-max容斥的。但是鉴于我没有脑子,所以其实没想到也可以理解。先来复习一下式子:\[Emax(S)=\sum_{T\subsetS}Emin(T)(-1)^{\midT\mid-1}\]所以带入要求的东西......