首页 > 其他分享 >「Round C10 B」间隔 题解

「Round C10 B」间隔 题解

时间:2023-10-08 19:57:26浏览次数:41  
标签:10 le 插入 int 题解 相邻 差值 C10 Round

简要题意

本题有 \(T\) 组数据。

给定一个由 \(n\) 个元素构成的正整数数列 \(a_1,a_2,a_3...a_{n-1},a_n\)。

问至少需要插入多少个整数才能使得 \(a\) 的各相邻元素之差相等(不能插入在头尾)。

\(a\) 数列保证是单调不减的。

\(1 \le n \le 10^6,0 \le a_i \le 10^6,1 \le T \le 10\)。

思路

一眼数学题,手玩样例。

4
3 7 11 19

对于上面的数据,可以得到各相邻元素差值为 4 4 8

明显,可以在 \(11\) 与 \(19\) 之间再插入一个 \(15\),使得相邻元素差值为 \(4\),需要插入 \(1\) 次。

3
3 8 10

同理,可得 5 2,这时没有其他方法,就是让相邻差值为 \(1\),

变成了 \(3,4,5,6,7,8,9,10\) 这样的连续数列,需要插入 \(5\) 次。

观察可以发现,我们寻找最小插入次数,本质是在寻找一个合法的最大差值,

想要让差值合法,那么就要求差值必须是原数列的各项零元素之差的因数。

同时要求最大,那不就是 \(\gcd\) 吗?

接下来就好办了,计算原数列相邻各元素之差的 \(\gcd\),

再计算相邻各元素之差(只有不等于 \(\gcd\) 的才参与计算)除以 $\gcd $ 减一之和,输出即可。

再注意一下部分 \(a_i\) 相等的情况,输出 \(-1\),但是这个地方特别坑,不能单纯判断相邻两个是否相等,

注意是部分 \(a_i\) 相等的情况!

Code

#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 20;
int t;
int main(){
    // freopen("interval.in","r",stdin);
    // freopen("interval.out","w",stdout);

    cin>>t;
    while(t --){
        int n,a[N],m,ans = 0;
        vector<int> f;
        cin>>n;
        f.push_back(114514);
        for(int i = 1;i <= n;i ++)
            cin>>a[i];
        bool flag = false,falg1 = true;
        for(int i = 1;i < n;i ++){
            if(a[i] != a[i + 1])
                falg1 = false;
            if(a[i] == a[i + 1])
                flag = true;
        }
        if(flag && !falg1){
            cout<<-1<<endl;
            continue;
        }
        for(int i = 1;i < n;i ++)
            f.push_back(a[i + 1] - a[i]);
        m = f[1];
        for(int i = 2;i < n;i ++)
            m = __gcd(f[i],m);
        for(int i = 1;i < n;i ++)
            if(f[i] != m)ans += f[i] / m - 1;
        // for(int i = 1;i < n;i ++)
        //     cout<<f[i]<<" ";
        // cout<<endl;
        cout<<ans<<endl;
    }
    return 0;
}

后记

啊啊啊啊啊啊好气啊我就是个大S*!!!炒鸡大撒被!!!请无视这个疯子。

考场上时忘了,是部分 \(a_i\) 相等的情况,所以……

我是黑暗傻逼大蒟蒻!请继续忽略这个疯子。

标签:10,le,插入,int,题解,相邻,差值,C10,Round
From: https://www.cnblogs.com/acangcang-Eliauk/p/17749986.html

相关文章

  • 2023.10.7 LGJ Round
    A你每秒种可以施展一种秘籍\(\{a_i,b_i\}\),使得后面\(a_i\)秒每秒都造成\(b_i\)伤害。问至少多少秒可以造成\(M\)的伤害。共\(n(n\le3e5)\)种秘籍,\(M\le1e18,a,b\le1e9\).显然可以二分答案,考虑二分\(mid\),那么我们要造成最多的伤害。贪心,每秒都选择在\(mid\)秒......
  • DBeaver [安装/问题解决]
     DBeaverMac版软件简介DBeaverMac版是一款专门为开发人员和数据库管理员设计的免费开源通用数据库工具。软件的易用性是它的宗旨,是经过精心设计和开发的数据库管理工具。免费、跨平台、基于开源框架和允许各种扩展写作(插件)。下载地址......
  • 【题解】CodeForces-1874/1875
    CodeForces-1875AJellyfishandUndertale一定是等待降到\(1\)或者能补满到\(a\)时才使用工具,依题意模拟即可。提交记录:Submission-CodeForcesCodeForces-1874AJellyfishandGame这种题目有点思路但是不是很会。赛时第一发写得根据奇偶性判断,\(k\)为偶数错了,然后感......
  • AtCoder Beginner Contest 323 (ABC 323) D、E、F 题解
    AtCoderBeginnerContest323(ABC323)D、E、F题解D题目大意给\(n\)种数\(s_i\),每一种数有\(c_i\)个,每次可以把两个相同的数合并为一个数,问最后会剩下多少数?分析对于每一个数\(s_i\),它最多被分解\(log_2c_i\)次,并且合并出来最大的数的大小小于\(s_i\timesc_i......
  • Hadoop问题解决(3)
    在启动hadoop过程中,出现如下错误:192.168.10.100:Invalidmaximumheapsize:-Xmx0m192.168.10.100:CouldnotcreatetheJavavirtualmachine.192.168.10.100:jobtracker已死,但pid文件仍存此时查看jobtracker的日志,1[root@ccloud100manager]#vim/var/log/hado......
  • hadoop问题解决(4)
    默认配置是将datanode,namenode,jobtracker,tasktracker,secondarynamenode的pid存放在/tmp目录下,随着linux的定期清理,这些pid就不见了,当然就无法停止了,怎么解决呢?在/tmp目录创建或者修改hadoop-hadoop用户名-datanode.pid 里面写入对应的pid, 可通过jps查看. namen......
  • 【UVA 12657】Boxes in a Line 题解(静态双向链表)
    您在编号为1的表格上有n个方框。n从左到右。您的任务是模拟4命令类型:•1XY:将框X向左移动到Y(如果X已经是Y的左侧,则忽略此项)•2XY:将框X向右移动到Y(如果X已经是Y的右侧,则忽略此项)•3XY:交换盒X和Y•4:反转整条线路。命令保证有效,即X不等于Y。例如,如果n=6,在执行114之后,该行......
  • 题解:洛谷P1119 灾后重建
    题解:洛谷P1119灾后重建题目传送门前言:没有掌握floyed求最短路的精髓是每次增加选一个中转点,导致写了2h才勉强卡过法1:最暴力的想法就是开个三维数组把前i个点的dis状态全部存下来,跑N次floyed,当然由于每次点数时递增的,所以实际复杂度远远小于O(N^4),算了下大概200个点跑了4e8多一......
  • 网络规划设计师真题解析--独立磁盘冗余阵列(二)(容量的计算)
    假如有3块容量是160G的硬盘做RAID5阵列,则这个RADI5的容量是(1);而如果有2块160G的盘和1块80G的盘,此时RAID5的容量是(2)。(1)A.320G    B.160G     C.80G     D.40G(2)A.40G     B.80G     C.160G    D.200G答案:(1)A (2)C解析:常见的RAID......
  • destoon : 后台无法登录问题解决
    经常有朋友在destoon搬家的时候,数据还原之后,会出现后台无法登录的情况.具体表现为后台帐号密码输入后点击确定,页面刷新.并没有跳转到相应后台页面.但是如果帐号密码输入错误,会提示密码错误的情况.这种情况多半是原系统设置中,设置了cookie作用域的问题,如......