首页 > 其他分享 >CF1901 C Add, Divide and Floor 题解

CF1901 C Add, Divide and Floor 题解

时间:2023-12-04 17:37:41浏览次数:33  
标签:ch Floor int 题解 ret 次数 CF1901 ans 操作

Link

CF1901 C Add, Divide and Floor

Question

给定一个长度为 \(n\) 的序列,每次操作你需要选择一个整数 \(x\) ,并将所有 \(a_i\) 替换为 \(\lfloor \frac{a_i+x}{2} \rfloor\) 。求至少多少次操作后能将所有 \(a_i\) 变相同

若最少次数小于等于 \(n\),输出操作次数和每次操作所选择的 \(x\),否则仅输出操作次数

Solution

先思考一个很显然的结论:若 \(a_i \le a_j\), 无论选取什么样的 \(x\),\(a_i'=\lfloor \frac{a_i+x}{2} \rfloor\),\(a_j'=\lfloor \frac{a_j+x}{2} \rfloor\) 有 \(a_i' \le a_j'\)。

所以,对于最小操作次数,我们只需要关注最大值和最小值就好了

由于每次操作只能让最大值和最小值的差值减少一半,所以操作次数就是 \(\log_2 (a_{max}-a_{min})+1\)

得到了操作次数,思考具体怎么操作

操作有一个性质,就是 \(x+2k\) 的作用和 \(x\) 是一样的,其中 \(k\) 是一个整数,也就是说,每次操作和 \(x\) 的奇偶性有关

作为一次操作,假设操作的两个数是 \(a,b (a>b)\) 我们一次操作期望 \(a-b\) 尽量小

那么我们可以分类讨论

  • \(a,b\) 同为奇数或偶数,\(x\) 奇偶随意
  • \(a\) 偶 \(b\) 奇 \(x\) 为奇数
  • \(a\) 奇 \(b\) 偶 \(x\) 为偶数

通过最开始的结论,可知 \(a=a_{max},b=a_{min}\) ,按着模拟即可

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=2e5+5,INF=2e9;
int a[maxn];
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;
}
void solve(){
    int N=read(),ans=0;
    int Max=-INF,Min=INF;
    for(int i=1;i<=N;i++) a[i]=read(),Max=max(Max,a[i]),Min=min(Min,a[i]);
    int now=Max-Min;
    while(now){
        now>>=1;
        ans++;
    }
    printf("%d\n",ans);
    if(ans<=N){
        for(int i=1;i<=ans;i++){
            int flg=0;
            if((Max&1)==0&&(Min&1)) flg=1;
            else if((Max&1)&&(Min&1)==0) flg=2;
            else flg=1;
            printf("%d ",flg);
            Max=(Max+flg)/2;
            Min=(Min+flg)/2;
        }
        if(ans)printf("\n");
    }
}
int main(){
    int T=read();
    while(T--)solve();
}

标签:ch,Floor,int,题解,ret,次数,CF1901,ans,操作
From: https://www.cnblogs.com/martian148/p/17875468.html

相关文章

  • Win11 Carla 安装教程 及 问题解决
    Win11Carla安装教程及问题解决Carlaversion:0.9.15Platform/OS:Windows11GPU:NVIDIAGeForceMX350RAM:16GBCarla下载地址:Releases·carla-simulator/carla·GitHub下载完成后解压,运行CarlaUE4.exe出现报错:Outofvideomemorytryingtoallocatearen......
  • CF1902 D Robot Queries 题解
    LinkCF1902DRobotQueriesQuestionRobot初始在\((0,0)\),有一个字符串\(s\),表示运行列表\(U\):y+1\(D\):y-1\(L\):x-1\(R\):x+1之后有\(Q\)次询问,有\(L,R,x,y\),问把运行序列的\([L,R]\)反转,Robot是否经过了点\((x,y)\)Solution显然,对于一个区间\([L,R]\)......
  • win10 访问 ubuntu 虚拟机 上的Django web 服务 操作 和 问题解决
    虚拟机版本VMware16proubuntu版本 Ubuntu22.04.1LTS 第一步:虚拟机设置NATEdit>VirtualNetworkEditor修改配置更改DHCP设置要注意ip地址要用在虚拟机Ubuntu系统中的网段范围 在NAT添加端口转发 查看ubuntu防火墙sudoufwstatus Status:ina......
  • CF1902 C Insert and Equalize 题解
    LinkCF1902CInsertandEqualizeQuestion有一个\(n\)个元素的数组\(a\),每个元素都不一样现在我们需要在\(a\)中添加一个数字\(a_{n+1}\),和之前的元素都不一样然后选择一个数\(x\),可以在一个元素上加\(x\),为操作一次,(每次加的数都是\(x\))求,操作的最少次数Solution......
  • 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$以及当......