Codeforces Pinely Round 3 (Div. 1 + Div. 2)

A.Distinct Buttons(思维)

题意:

你在开始时站在点 ( 0 , 0 ) (0,0) (0,0),同时,手上有一个遥控器,上面有四个按钮:

  • U:移动到 ( x , y + 1 ) (x, y + 1) (x,y+1)的位置

  • R:移动到 ( x + 1 , y ) (x + 1, y) (x+1,y)的位置

  • D:移动到 ( x , y − 1 ) (x, y - 1) (x,y1)的位置

  • L:移动到 ( x − 1 , y ) (x - 1, y) (x1,y)的位置

如果四个按钮都被按下过,那么遥控器将会被损坏,问能否到达给出的所有 n n n个点。

分析:

如果只能使用三个按键,那么只有在需要到达的所有点均在以下四个面中的一个时才能完成:

  • 所有点都在 x x x轴上方

  • 所有点都在 x x x轴下方

  • 所有点都在 y y y轴左侧

  • 所有点都在 y y y轴右侧

输入时使用数组记录出现的位置,最后判断输出即可。

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 5e2;

void solve() {
    int n;
    cin >> n;
    int a[5] = {0, 0, 0, 0};
    for (int i = 0; i < n; i++) {
        int x, y;
        cin >> x >> y;
        if (x > 0) {
            a[0] = 1;
        } else if (x < 0) {
            a[1] = 1;
        }
        if (y > 0) {
            a[2] = 1;
        } else if (y < 0) {
            a[3] = 1;
        }
    }
    if (a[0] + a[1] + a[2] + a[3] > 3) cout << "No" << endl;
    else cout << "Yes" << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

B.Make Almost Equal With Mod(思维)

题意:

给出一个数组 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,你可以选择一个数字 k k k,使数组中所有数字对 k k k取模,问 k k k等于多少时,可以使得数组中的数字再操作后恰好包含两种不同的数字。

分析:

依次枚举 2 2 2的次方数即可。

说明:

  • 选择 2 2 2作为 k k k时,剩下的结果仅包含 0 , 1 0, 1 0,1

  • 如果剩下的数字全部为 0 0 0 1 1 1,继续选择 2 2 = 4 2^2 = 4 22=4作为 k k k,若选择 2 2 2时剩下的数字为 0 0 0,那么选择 k = 4 k = 4 k=4时剩下的就是 0 , 2 0, 2 0,2,同理,剩下数字均为 1 1 1,则选择 k = 4 k = 4 k=4时剩下的数字就是 1 , 3 1, 3 1,3

  • 依次类推,由于每次取模的结果只会有两种可能性,那么当结果中两种情况均出现就找到了合法的 k k k

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 5e2;

LL a[MAXN];

void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (LL i = 2; ; i <<= 1) {
        set<LL> S;
        for (int j = 1; j <= n; j++) {
            S.insert(a[j] % i);
            if (S.size() > 2) break;
        }
        if (S.size() == 2) {
            cout << i << endl;
            return;
        }
    }
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

C.Heavy Intervals(思维)

题意:

给出 n n n个区间 [ l i , r i ] [l_i, r_i] [li,ri],每个区间包含一个权值 c i c_i ci,且区间的价值为: c i × ( r i − l i ) c_i \times (r_i - l_i) ci×(rili),你可以在保证区间合法 ( l i < r i ) (l_i < r_i) (li<ri)的情况下,对所有区间的 l i , r i , c i l_i, r_i, c_i li,ri,ci进行任意重排,问所有区间的价值之和最小是多少?

分析:

既然要让价值之和最小,那么大的权值 c i c_i ci就要与长度更小的区间匹配,那要怎么在保证区间合法的情况下,让构造的区间尽可能长呢?

可以使用类似括号匹配的思想,先对 l i l_i li r i r_i ri进行排序,把 l i l_i li r i r_i ri视为左右括号进行括号匹配,并将构造成的区间长度记录下来。

完成匹配后,对权值 c i c_i ci和构造的区间长度 l e n len len进行排序,并按最大的权值和最小的区间长度进行匹配,次大的权值和次小的区间长度进行匹配,依次类推,就能得到最小的价值之和。

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 5e2;

LL l[MAXN], r[MAXN], c[MAXN], len[MAXN];

stack<int> st;

void solve() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> l[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> r[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> c[i];
    }
    sort(l, l + n);
    sort(r, r + n);
    sort(c, c + n);
    int pos_l = 0, pos_r = 0, cnt = 0;
    for (int i = 0; i < n * 2; i++) {
        if (pos_l < n && pos_r < n) {
            if (l[pos_l] < r[pos_r]) {
                st.push(l[pos_l++]);
            } else {
                len[cnt++] = r[pos_r++] - st.top();
                st.pop();
            }
        } else {
            len[cnt++] = r[pos_r++] - st.top();
            st.pop();
        }
    }
    LL ans = 0;
    sort(len, len + n);
    for (int i = 0, j = n - 1; i < n; i++, j--) {
        ans += len[i] * c[j];
    }
    cout << ans << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

D.Split Plus K(思维)

题意:

给出 n n n个正整数 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,你可以进行若干次以下操作:

  • 选择一个数字 x x x,并将这个数字删除。

  • 选择两个正整数 y , z y, z y,z满足 y + z = x + k y + z = x + k y+z=x+k,并将这两个数字放回。

问:能否在经过若干次操作后,使数组中所有数字相同,如果可以,输出最少操作次数,否则,输出-1.

分析:

由于每次产生的两个数字 y , z y, z y,z的总和会比原本的数字 x x x k k k,因此,如果一个数字被分解了 m m m次,那么得到的 m + 1 m + 1 m+1个数字的总和就是 x + m × k x + m \times k x+m×k

b 0 , b 1 , . . . , b m b_0, b_1, ..., b_m b0,b1,...,bm为最后生成的 m + 1 m + 1 m+1个数字,由于分解时会增加 k k k,且会增加 m m m次,那么可以将 m m m k k k分配给 b 1 ∼ b m b_1 \sim b_m b1bm,即最后生成的数字为 b 0 , b 1 + k , b 2 + k , . . . , b m + k b_0, b_1 + k, b_2 + k, ..., b_m + k b0,b1+k,b2+k,...,bm+k

由题目可得以下两个式子:

  • b 0 = b 1 + k = . . . = b m + k b_0 = b_1 + k = ... = b_m + k b0=b1+k=...=bm+k

  • b 0 + b 1 + k + . . . + b m + k = a i + m × k b_0 + b_1 + k + ... + b_m + k = a_i + m \times k b0+b1+k+...+bm+k=ai+m×k

由于无法知道最后分解出的数字数量 m m m到底是多少,因此需要对式子进行化简,让第二个式子两边同时减去 m + 1 m + 1 m+1 k k k,可得:

  • ( b 0 − k ) + b 1 + . . . + b m = a i − k (b_0 - k) + b_1 + ... + b_m = a_i - k (b0k)+b1+...+bm=aik

而此时所有的 b 1 ∼ b m b_1 \sim b_m b1bm以及 b 0 − k b_0 - k b0k均为 a i − k a_i - k aik的因子,因此,可以在输入后,将所有 a i a_i ai均减去 k k k

然后,需要考虑,如果减去 k k k后的 a a a数组中出现了同时包含正负数或同时出现 0 0 0和其他数字,此时是无法完成构造的,直接输出 − 1 -1 1

最后考虑最后生成的数字,既然要让操作次数尽可能少,那么拆出的数字就要尽可能大,怎么选择最大的结果呢?只有选择减去 k k k之后的所有 a i − k a_i - k aik的最大公约数 G G G

由于每次操作会增加一个数字,因此,将 a i − k a_i - k aik分解为若干个 G G G所需的操作次数为 a i − k G − 1 \frac{a_i - k}{G} - 1 Gaik1

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 5e2;

LL n, k, a[MAXN];

void solve() {
    cin >> n >> k;
    LL maxn = -1e18, minn = 1e18;
    for (int i = 1; i <= n; i++) cin >> a[i], a[i] -= k, maxn = max(maxn, a[i]), minn = min(minn, a[i]);
    if (maxn == minn) {
        cout << 0 << endl;
        return;
    }
    if (minn < 0 && maxn >= 0 || minn == 0 && maxn > 0) {
        cout << "-1" << endl;
        return;
    }
    LL g = a[1];
    for (int i = 2; i <= n; i++) g = __gcd(g, a[i]);
    LL ans = 0;
    for (int i = 1; i <= n; i++) {
        ans += a[i] / g - 1;
    }
    cout << ans << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

学习交流


以下为学习交流QQ群,群号: 546235402,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/271987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于“Python”的核心知识点整理大全43

目录 ​编辑 15.2.3 使2散点图并设置其样式 scatter_squares.py 15.2.4 使用 scatter()绘制一系列点 scatter_squares.py 15.2.5 自动计算数据 scatter_squares.py 15.2.6 删除数据点的轮廓 15.2.7 自定义颜色 15.2.8 使用颜色映射 scatter_squares.py 注意 15.2.9…

【ubuntu22.04安装mysql8并配置远程连接】

1.安装mysql 使用管理员权限以下命令安装mysql 1.更新仓库 sudo apt-get update sudo apt-get upgrade2.安装mysql sudo apt install mysql-server3.安装完成之后就可以使用命令 //查看mysql运行状态 sudo systemctl status mysql //登录mysql mysql -uroot -p 然后随便输入一个…

【NI-RIO入门】记录和监控数据

1.内部存储器 可以使用常规文件 I/O VI 在嵌入式程序中以编程方式访问实时控制器的内部存储。文件路径结构根据控制器运行的实时操作系统 (RTOS) 的不同而有所不同。 该文件路径语法记录在教程&#xff1a;使用实时目标上的文件路径 中。 可以通过在Measurement & Automati…

重定向和转发(sendRedirect()和getRequestDispatcher())

重定向 是什么 用户通过浏览器发送一个请求&#xff0c;Tomcat服务器接收这个请求&#xff0c;会给浏览器发送一个状态码302&#xff0c;并设置一个重定向的路径&#xff0c;浏览器如果接收到了这个302的状态码以后&#xff0c;就会去自动加载服务器设置的路径 一个页面跳转…

在小公司 “混” 了2年,我只认真做了5件事,如今顺利拿到字节 Offer

说下我的情况 是的&#xff0c;我一家小公司工作了整整两年时间&#xff0c;在入职这家公司前&#xff0c;也就是两年前&#xff0c;我就开始规划了我自己的人生&#xff0c;所以在两年时间里&#xff0c;我并未懈怠。 现如今&#xff0c;我已经跳槽到了字节&#xff0c;顺利…

Typora使用PicGo+Gitee上传图片

Typora使用PicGoGitee上传图片 1.下载PicGo(国内镜像) https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo/ 点击PicGo-Setup-2.3.0-x64.exe &#xff08;64位安装&#xff09; 然后打开gitee&#xff08;没注册先注册&#xff09; 2.下载node.js插件 https:/…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的&#xff0c;只有一个 single_table 表是不够的&#xff0c;所以为了故事的顺利发展&#xff0c;我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见&#xff0c;我们把 single_table 表称为 s1 表&#xff0…

USB启动盘是什么?要如何制作USB启动盘?本文都告诉你

如何制作USB启动盘 USB启动盘怎么制作&#xff1f;下面我们一起来看一看。注意&#xff1a;在执行以下步骤之前&#xff0c;请确保您备份了重要数据&#xff0c;因为这个过程会格式化USB驱动器&#xff0c;清除其上的所有数据。1. 选择操作系统镜像 首先&#xff0c;您需要…

MYSQL数据库的备份与恢复-数据库实验七

一、实验目的 1. 了解备份和恢复的基本概念。 2. 掌握使用MySQL命令进行数据库备份的操作方法。 3. 掌握使用MySQL命令进行数据库恢复的操作方法。 二、实验内容 1. 使用mysqldump命令备份数据库studentsdb的所有表&#xff0c;存于D:\下&#xff0c;文件名为all_tables.s…

Unity 旋转跟随

Unity 使用任意一个局部轴指向目标 效果&#xff1a; 主要用于在编辑器中可视化对象的朝向&#xff0c;同时提供了选择不同轴向的功能。在运行时&#xff0c;物体将根据所选择的轴向朝向目标&#xff0c;并在 Scene 视图中绘制一个带箭头的圆环。 定义轴向枚举&#xff1a;…

Node.js版本对比

目录 1. node版本与Npm版本对照表 2. node版本与node-sass版本对照表 3. node-sass与sass-loader版本对照表 1. node版本与Npm版本对照表 以往的版本 | Node.js 下面显示最新的对应内容&#xff0c;如果需要查找历史版本&#xff0c;可以进入上面的页面查询 VersionLTSDateV8np…

【网络安全 | 网络协议】结合Wireshark讲解HTTP协议

前言 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。 文章目录 前言HTTP协议Wireshark抓包分析 HTTP协议在Wireshark数据包中是…

Ubuntu16.04下载安装藏文字体详细教程(附图)

Ubuntu16.04下安装藏文字体详细教程&#xff08;附图&#xff09; 你是不是也被ubuntu系统中藏文或者中文总是不显示且乱码的问题困扰呢&#xff0c;那么你可以看看我的解决方法。 在没有装藏文或中文字体前你在打开一个文本文件的时候是不是下面这样的 安装步骤 上传或下载若…

负载均衡——Ribbon

文章目录 Ribbon和Eureka配合使用项目引入RibbonRestTemplate添加LoadBalanced注解注意自定义均衡方式代码注册方式配置方式 Ribbon脱离Eureka使用 Ribbon&#xff0c;Nexflix发布的负载均衡器&#xff0c;有助于控制HTTP和TCP客户端的行为。基于某种负载均衡算法&#xff08;轮…

制作一个TikTok引流脚本需要懂哪些代码?

在数字营销领域&#xff0c;TikTok已经成为一个不可或缺的平台&#xff0c;许多品牌和商家都希望通过TikTok来吸引更多的潜在客户&#xff0c;提高品牌知名度和销售额。 为了实现这一目标&#xff0c;一些商家选择使用TikTok引流脚本&#xff0c;那么&#xff0c;制作一个TikT…

【三维重建】单目三维重建

[TOC]【三维重建】单目三维重建 1. 资料收集 基于marigold的深度恢复与三维重建 file link community repainting_3d_assets 2. 单目深度恢复 输入与效果恢复如下&#xff1a; 3. 单目三维重建 4. 纹理恢复方法&#xff08;这里是TEXT to 3D 的实现方法&#xff09; 输…

信号与线性系统翻转课堂笔记13——拉普拉斯(逆)变换及其性质

信号与线性系统翻转课堂笔记13——拉普拉斯&#xff08;逆&#xff09;变换及其性质 The Flipped Classroom13 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &am…

CentOS7之开启ssh远程登录

参考&#xff1a;https://www.cnblogs.com/travis-li/p/12550370.html cd /etc/ssh/ # 修改配置 vim sshd_config# 开启服务 sudo service sshd start# 检查 ps -e | grep sshd# 开机自启 systemctl enable sshd.service# 查看(验证)开机自启服务 [rootlocalhost liangshijie]…

腾讯云优惠全站搜,你想要的优惠都在这!

腾讯云推出优惠全站搜页面 https://curl.qcloud.com/PPrF9NFe 在这个页面可以一键查询所需云服务器、轻量应用服务器、数据库、存储、CDN、网络、安全、大数据等云产品优惠活动大全&#xff0c;活动打开如下图&#xff1a; 腾讯云优惠全站搜 腾讯云优惠全站搜页面 txybk.com/go…

SpringBoot源码搭建

文章目录 源码下载搭建项目构建学习博客 源码下载 需要环境 &#xff1a; JDK 1.8Maven 3.5Spring Boot 1.x.x: Gradle 版本建议为2.9或更高版本。Spring Boot 2.x.x: Gradle 版本建议为4.x.x或更高版本。 GitHub 从v2.3.x开始&#xff0c;SpringBoot开始强制用Gradle构建项…