2023牛客寒假算法集训营3

news2025/1/14 18:58:14

(数学场真折磨人)

A. 不断减损的时间(贪心)

题意:

给定一个数组,任意次操作,每次操作可以 选择一个偶数除以 2 2 2

求最终数组所有元素之和的最小值。

思路:

要使得所有元素之和最小,那肯定是只对 正偶数 进行操作,每次除以 2 2 2 ,直到为 0 0 0 或者不是偶数为止。

代码:

#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define PII pair<int, int>
using namespace std;
const int N = 1e5 + 10;

ll a[N];

void solve()
{
    int n;
    cin >> n;

    ll sum = 0;
    for (int i = 1; i <= n; i++){
        ll x;
        cin >> x;
        if (x > 0){
            while (x % 2 == 0){
                x /= 2;
            }
        }
        
        sum += x;
    }

    cout << sum << endl;
}

int main()
{
    ios:: sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int t = 1;
    //cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

B. 勉强拼凑的记忆(思维 + 找规律)

题意:

给定 n 块矩形积木来搭建正方形,可以自由选择每块积木的大小,但长和宽必须符合 1 × k 1 × k 1×k ,其中 1 ≤ k ≤ ⌈ n 2 ⌉ 1≤k≤⌈\frac{n}{2}⌉ 1k2n(向上取整).

问能否用恰好 n 块矩形拼成正方形,若可以,则输出所能搭建的最大正方形的边长,否则输出 -1.

思路:

要想拼出的正方形最大,每个矩形积木的边 k k k 就要尽可能的长。

因为 k k k 最大为 ⌈ n 2 ⌉ ⌈\frac{n}{2}⌉ 2n,所以我们可以贪心地先拼一个边长为 最大的 k = n + 1 2 最大的k = \frac{n + 1}{2} 最大的k=2n+1 的正方形,消耗 n + 1 2 \frac{n + 1}{2} 2n+1 个矩形拼成一个基本的正方形,再考虑增加它的边长。

我们发现,后面正方形的边长每增加 1 1 1 ,就需要 3 3 3 个矩形。

证明:因为原来的正方形的边长已经是最大的 k k k 了,后面加上去的矩形长度不可能超过 k k k ,所以在长和宽两侧加上 2 2 2 1 × k 1 × k 1×k 的矩形后,在对角线位置还要加上个 1 × 1 1 × 1 1×1​ 的小正方形。

所以最后只需要 3 3 3 个一组,判断剩下的矩形能分成多少组,相加即为最大正方形的边长。

代码:

#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define PII pair<int, int>
using namespace std;
const int N = 2e5 + 10;

void solve()
{
    ll n;
    cin >> n;

    if (n == 2){
        cout << -1 << endl;
        return;
    }
    
    ll res = (n + 1) / 2;
    cout << res + (n - res) / 3 << endl;
}

int main()
{
    ios:: sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int t;
    cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

C. 忽远忽近的距离(构造 + 找规律)

题意:

要求构造一个长度为 n 的序列,对于每一个 a i a_i ai ,满足 2 ≤ ∣ a i − i ∣ ≤ 3 2 \le |a_i - i| \le 3 2aii3 .

注:数组下标从 1 1 1 n n n.

排列是指长度为 n n n 的数组, 1 1 1 n n n​ 每个正整数恰好出现一次。

【示例输入】

4

【示例输出】

3 4 1 2

思路:

从样例可以发现, [ 3 , 4 , 1 , 2 ] [3, 4, 1, 2] [3,4,1,2] 是一组合法解,那么可以以此构造出所有 n = 4 k n=4k n=4k 形式的情况: [ 3 , 4 , 1 , 2 , 7 , 8 , 5 , 6 ] [3,4,1,2,7,8,5,6] [3,4,1,2,7,8,5,6] 等。

之后我们可以尝试构造 n = 5 n=5 n=5 n = 6 n=6 n=6 的情况,发现有 [ 4 , 5 , 1 , 2 , 3 ] [4,5,1,2,3] [4,5,1,2,3] [ 4 , 5 , 6 , 1 , 2 , 3 ] [4,5,6,1,2,3] [4,5,6,1,2,3]

那么可以构造出 n = 4 k + 5 n=4k+5 n=4k+5 n = 4 k + 6 n=4k+6 n=4k+6 n = 4 k + 5 + 6 n=4k+5+6 n=4k+5+6 的情况,

以上分别对应 n   %   4 n \ \% \ 4 n % 4 等于 1 、 2 、 3 1、2、3 123 的情况,

加上之前的 n = 4 k n=4k n=4k​,那么就覆盖了几乎所有正整数。

此外,我们还可以发现,当 n = 7 n = 7 n=7 n < 4 n < 4 n<4 时是无解的,需要对其特判。

例如 n = 13 n=13 n=13 ,我们发现 13 = 4 × 2 + 5 13=4×2+5 13=4×2+5 ,那么可以构造成: [ 3 , 4 , 1 , 2 , 7 , 8 , 5 , 6 , 12 , 13 , 9 , 10 , 11 ] [3,4,1,2,7,8,5,6,12,13,9,10,11] [3,4,1,2,7,8,5,6,12,13,9,10,11] ,即 13 = 4 + 4 + 5 13=4+4+5 13=4+4+5 的情况。

代码:

#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define PII pair<int, int>
using namespace std;
const int N = 2e5 + 10;

int n;
int a[N];

void solve()
{
    cin >> n;
    
	if(n < 4 || n == 7){
		cout << -1 << endl;
		return;
	}
    
	if(n % 4 == 0)
    {
		for(int i = 1; i <= n; i += 4)  //构造一段循环序列[3, 4, 1, 2],下面同理
        {
			a[i] = i + 2, a[i + 1] = i + 3,
			a[i + 2] = i, a[i + 3] = i + 1;
		}
	}
	else if(n % 4 == 1)
    {
        a[1] = 4, a[2] = 5, a[3] = 1, a[4] = 2, a[5] = 3;
		for(int i = 6; i <= n; i += 4)
        {
			a[i] = i + 2, a[i + 1] = i + 3,
			a[i + 2] = i, a[i + 3] = i + 1;
		}
	}
	else if(n % 4 == 2)
	{
        a[1] = 4, a[2] = 5, a[3] = 6, a[4] = 1, a[5] = 2, a[6] = 3;
		for(int i = 7; i <= n; i += 4)
		{
			a[i] = i + 2, a[i + 1] = i + 3,
			a[i + 2] = i, a[i + 3] = i + 1;
		}
	}
	else if(n % 4 == 3)
    {
        a[1] = 4, a[2] = 5, a[3] = 1, a[4] = 2, a[5] = 3,
		a[6] = 9, a[7] = 10, a[8] = 11, a[9] = 6, a[10] = 7, a[11] = 8;
		for(int i = 12; i <= n; i += 4)
        {
			a[i] = i + 2, a[i + 1] = i + 3,
			a[i + 2] = i, a[i + 3] = i + 1;
		}
	}

    for (int i = 1; i <= n; i++)
        cout << a[i] << ' ';
    cout << endl;
}

int main()
{
    ios:: sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int t = 1;
    //cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

D. 宿命之间的对决(博弈 + 思维)

题意:

A 和 B 两人在玩一个游戏。规则如下:

给定一个正整数 n n n ,A 和 B 轮流操作,每次取 n n n 的一个因子 x x x ,用 n n n 减去 x x x ,后续的因子 x x x 变为每次减小后的数 n n n 的因子。谁先将 n n n 减到 0 0 0 谁输。

判断谁会获胜。若 A 获胜,输出 “kou”,否则输出 “yukari”.

思路:

【一】

显然 n = 1 n = 1 n=1 的话,先手必输。

结论:所有奇数都是先手必输

证明:由于奇数只包含奇数的因子,那么只能取一个奇数变成偶数(或者变成0直接输掉),然后对方就可以直接取 1 1 1​ 变成奇数,仍然到必输的状态。因此 奇数先手必输,偶数先手必胜

【二】

换一种思路,游戏规则不变,我们只关心游戏的结果,游戏的过程并不重要。

考虑到 1 1 1 ,因为 1 1 1 是所有正整数的因子,所以我们可以将游戏改为每次都减去一个 1 1 1 ,不影响游戏结果,得到同样的结论:奇数先手必输,偶数先手必胜。

代码:

#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define PII pair<int, int>
using namespace std;
const int N = 2e5 + 10;

void solve()
{
    ll n;
    cin >> n;

    ll cnt = dcpCount(n);
    if (cnt % 2) cout << "yukari" << endl;
    else cout << "kou" << endl;
}

int main()
{
    ios:: sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int t = 1;
    //cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

E. 公平守望的灯塔(计算几何)

题意:

在平面直角坐标系上给定两个不重合的点 A A A B B B ,要求找到一个整数点 C C C ,使得满足三角形 A B C ABC ABC 是以 A B AB AB 为斜边的等腰直角三角形。

如果无解,输出 “No Answer!”,否则,输出任意一个符合条件的 C C C 点坐标。

思路:

【一】向量法

一个计算几何的常用知识:向量 ( x , y ) (x,y) (x,y) 和向量 ( − y , x ) (-y,x) (y,x) 的夹角为 90 90 90 度(因为点乘为 0 0 0)。

那么我们假设 A B AB AB 向量为 ( x , y ) (x,y) (x,y) ,那么我们从 A A A 点为起点加上向量 ( − y , x ) (-y,x) (y,x) 得到 C C C 点,那么 B C BC BC 的中点即为所求。

只需要判断是否是整数即可。(由于只有求中点时除2,所以只需要判奇偶)。

【二】坐标点计算

假设坐标点,联立方程组计算,如下图所示:

在这里插入图片描述
得到 C C C 点坐标后,判断其是否是整数即可。

代码(思路二):

#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define PII pair<int, int>
using namespace std;
const int N = 2e5 + 10;

void solve()
{
    double x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;

    int xx = x1 + y1 + x2 - y2;
    int yy = -x1 + y1 + x2 + y2;
    if (xx % 2 != 0 || yy % 2 != 0)  //p
        cout << "No Answer!" << endl;
    else cout << xx / 2 << ' ' << yy / 2 << endl;
}

int main()
{
    ios:: sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int t = 1;
    //cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

F. 迎接终结的寂灭(签到)

题意:

签到题,宇宙终极答案是 42 .

思路:

输出 42 即可。

代码:

#include <iostream>
using namespace std;

int main()
{
    cout << 42 << endl;

    return 0;
}

G. 严肃古板的秩序

过年太忙了,后面三题过几天再写qwq


I. 灵魂碎片的收集


K. 永恒守候的爱恋


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(python)selenium工具的安装及其使用

selenium概述 一个自动化测试工具。它可以让python代码调用浏览器。并获取到浏览器中加载的各种资源 优缺点&#xff1a; 优点 selenium能够执行页面上的js&#xff0c;对于js渲染的数据和模拟登陆处理起来非常容易使用难度简单爬取速度慢&#xff0c;爬取频率更像人的行为&a…

k8s安装nfs设置pv pvc并部署mysql

在k8s系列第一篇中提到有一个用于nfs机器没有部署任何东西&#xff0c;这一篇我们来搭建nfs服务&#xff0c;并在k8s上部署mysql&#xff0c;并将mysql的data目录映射到nfs中。网上的部分教程为了简便教学用的hostPath做的映射&#xff0c;只是便于教学的简便做法&#xff0c;实…

Linux常用命令——skill命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) skill 向选定的进程发送信号冻结进程 补充说明 skill命令用于向选定的进程发送信号&#xff0c;冻结进程。这个命令初学者并不常用&#xff0c;深入之后牵涉到系统服务优化之后可能会用到。 语法 skill(选项…

vim的自动化配置(一条指令就够了)

应该没有人在因为vim中括号不能对齐和补齐和自动缩进而烦恼吧&#xff01; 自动化配置不香吗&#xff1f; 如果你想把你的vim给配置成像vs2022编译器一样&#xff0c;那么恭喜你&#xff0c;当你看到这篇文章的时候你就要成功了&#xff01; 一条指令&#xff0c;下载出vs20…

Java 分支及循环语句

文章目录一、分支语句1. if 语句2. switch 语句二、循环语句1. for 循环语句2. while 循环语句3. do...while 循环语句4. 跳转控制语句5. 循环嵌套6. Random6.1 猜数字游戏一、分支语句 1. if 语句 if(关系表达式1) {语句体1; } else if(关系表达式2){语句体2; } ... else {语…

带你去了解什么是makefile文件

GNU make命令是用来控制从源文件生成可执行文件或非可执行文件的方式。那么make命令又是通过makefile文件来控制了。所以了解makefile文件就显得很有必要了。 makefile文件由许多规则组成&#xff0c;这些规则的形式一般是这样的&#xff1a; 目标 ... : 先决条件 ...命令目标…

PMP范围和需求的区别是什么?

定义需求&#xff1a;为满足业务需求&#xff0c;某个产品、服务或成果必须达到的条件或具备的能力。范围&#xff1a;项目所提供的产品、服务和成果的总和。在PMI中我们常说的范围一般为项目范围&#xff0c;其定义为&#xff1a;为交付具有规定特性与功能的产品、服务或成果而…

现金+股票再平衡策略的测试 - 针对恒指

最近很多人在讨论一个策略&#xff0c;就是50%现金&#xff0c;50%ETF&#xff0c;然后按照一定的策略再平衡一次&#xff0c;将会获得比单纯股票投资更安全的策略和更加稳定的收益。我做了一个简单的回测。 测试模式1 1990-01-02 - 2023-01-20 长期涨模式 首先假设我找到了一…

Redis面试题万字汇总 [施工中]

1. Redis 数据结构Redis底层有五种数据结构,String, long / double : 底层是小于Long的数字时, 使用的时long字符.它也可以支持double类型浮点数,embstr : 如果是短字符串,长度小于39个字节, 使用的是embstr数据结构. 之所以是39字节,主要是redis的jemalloc最小单位是64个字节,…

深度估计源码详解

源码链接见文末 论文地址: Monocular Depth Estimation Using Laplacian Pyramid-Based Depth Residuals | IEEE Journals & Magazine | IEEE Xplore 1.项目环境配置 项目中所包含的库直接使用pip install就好,但是有3个地方需要处理一下: fcntl,这个需要打开anacon…

DFS(六) N皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/pr…

浮动 应用场景 浮动的基本特点 高度坍塌 解决浮动时盒子冲突问题

目录浮动应用场景浮动的基本特点盒子尺寸盒子排列文字环绕高度坍塌浮动 视觉格式化模型&#xff0c;大体上将页面中盒子的排列分为三种方式&#xff1a; 常规流浮动定位 应用场景 文字环绕横向排列 浮动的基本特点 修改float属性值为&#xff1a; left&#xff1a;左浮动…

【HBase入门】6. 常用 Shell 操作(3)

前言 我们可以以shell的方式来维护和管理HBase。例如&#xff1a;执行建表语句、执行增删改查操作等等。 过滤器的用法 过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明&#xff0c;我们来看以下&#xff0c;HBase的过滤器该如何使用。 …

快速排序的实现和优化~

相比于冒泡排序的改进点&#xff1a; 在前面学过的冒泡排序中&#xff0c;由于扫描过程只对相邻的两个元素进行比较&#xff0c;因此在互换两个相邻元素时&#xff0c;只能消除一个逆序&#xff0c;如果能通过两个(不相邻的)元素的交换&#xff0c;消除待排序记录 中的多个逆序…

docker desktop window10家庭版踩坑实录

安装 桌面版&#xff1a;https://www.docker.com/products/docker-desktop 这里我就安装的是桌面版 选择windows 前置工作 1.按下 wins&#xff08;找到这个&#xff09; 将下面的这个勾选中&#xff0c;如果你是家庭版很可能没有这个东西&#xff0c;那么请看我的这篇文章…

5-5中央处理器-指令流水线

文章目录一.基本概念1.多条指令在处理器中的执行方式&#xff08;1&#xff09;顺序执行方式/串行执行方式&#xff08;2&#xff09;流水线执行方式①一次重叠执行方式②二次重叠执行方式2.流水线的表示方法&#xff08;时空图&#xff09;3.超标量流水线二.分类1.部件功能级、…

第四十五章 动态规划——背包问题模型(二)

一、概述 我们在上一章中已经对背包模型做了一定地讲解&#xff0c;但是我们发现其实在上一章节中我们所介绍的例题大部分是给背包问题套上一个背景&#xff0c;当我们识破了背后的模型后&#xff0c;我们就可以直接套用模板&#xff0c;基本不需要对代码做改变。 那么在这一…

SpringBoot读写Redis客户端并实现技术切换(Jedis)

SpringBoot整合Redishttps://blog.csdn.net/weixin_51882166/article/details/128759780?spm1001.2014.3001.5501 读写客户端 首先应该打开redis服务&#xff1b; cd命令进入Redis安装目录下&#xff1a; 进入Redis客户端&#xff1a; redis-cli.exe -h 127.0.0.1 -p 6379…

梯度下降算法有哪些?有什么区别?【背景、原理、公式、代码】

一、梯度下降算法背景 梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯…

行为型模式-职责链模式

1.概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导能批准的天数不同…