2023寒假算法集训营3

news2024/11/16 9:48:45

(数学场真折磨人)

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;
}

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

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

相关文章

三十四、Kubernetes1.25中Ingress介绍、安装

1、介绍 在前面文章中已经提到&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff1a;NotePort和LoadBalancer&#xff0c;但是这两种方式&#xff0c;都有一定的缺点&#xff1a; NodePort方式的缺点是会占用很多集群机器的端口&#xff0c;那么当集群服务变多的…

【JavaSE专栏2】JDK、JRE和JVM

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

Nacos-统一配置中心

Nacos-统一配置中心统一配置管理1.Nacos编写配置文件2.微服务拉取配置&#xff08;1&#xff09;引入pom依赖&#xff08;2&#xff09;添加bootstrap.yaml&#xff08;3&#xff09;读取nacos配置3.配置热更新&#xff08;1&#xff09;方式一&#xff08;2&#xff09;方式二…

Ubuntu显示优化 动画

之前从win转到了ubuntu。老大哥问我为啥不直接用Mac。我笑笑没说话。其实就一个字&#xff0c;穷。 使用Ubuntu的过程中有一点小问题&#xff0c;不过平时我主要用来编程&#xff0c;对壁纸&#xff0c;过渡动画这些东西其实并不是很在乎。直到我审美感爆棚的妻子告诉我&#…

设计模式学习(十一):Builder建造者模式

一、什么是Builder模式大都市中林立着许多高楼大厦&#xff0c;这些高楼大厦都是具有建筑结构的大型建筑。通常&#xff0c;建造和构建这种具有建筑结构的大型物体在英文中称为Build。在建造大楼时&#xff0c;需要先打牢地基&#xff0c;搭建框架&#xff0c;然后自下而上地一…

AcWing 278. 数字组合

AcWing 278. 数字组合一、问题二、思路1、状态表示2、状态转移3、循环设计4、初末状态三、代码一、问题 二、思路 这道题其实看上去和我们的01背包问题是非常相似的。如果这道题我们转化为01背包问题的话&#xff0c;描述如下&#xff1a; 给很多个物品和体积&#xff0c;然后…

深入理解Mysql底层数据结构

一. 索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构。 二. 索引的数据结构 二叉树红黑树Hash表BTreeBTree mysql的索引采用的是B树的结构 mysql为什么不用二叉树&#xff0c;因为对于单边增长的数据列&#xff0c;二叉树和全表扫描差不多&#xff0c;效率没有什…

pytorch 神经网络笔记-RNN和LSTM

文章目录时间序列表示方法一般过程RNNRNN原理1RNN原理2RNN layer使用pytorch实现nn.RNN__init__forwardSingle layer RNN2 layer RNNpytorch实现nn.RNNCell时间序列波形预测例子LSTMnn.LSTMnn.LSTMCellSingle layerTwo Layersb站课程链接课时自己找一下 时间序列表示方法 卷积神…

自注意力(Self-Attention)机制浅析

一、自注意力机制概述循环神经网络由于信息传递的容量以及梯度消失问题&#xff0c;实际上也只能建立短距离依赖关系。为了建立长距离的依赖关系&#xff0c;可以增加网络的层数或者使用全连接网络。但是全连接网络无法处理变长的输入序列&#xff0c;另外&#xff0c;不同的输…

字节青训前端笔记 | Web安全

在网络时代下&#xff0c;Web 安全随处可见并且危害极大&#xff0c;Web 安全问题也越来越受到重视。本节课将讲述Web中的攻击和防御 XSS 利用开发者盲目信任客户提交的内容来实现的工具&#xff0c;恶意攻击者往 Web 页面里插入恶意 Script 代码&#xff0c;当用户浏览该页面…

机器视觉(十二):二维条码识别

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

【16】C语言 | 初识函数递归 | 几个练习

目录 什么是递归? 练习1: 练习2: 练习3、 练习4 什么是递归? 程序调用自身的编程技巧称为递归( recursion )。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化…

生物化学 电阻抗成像OpenEIT,Dbar算法,数据集等(暂记)

Electrical Impedance Tomography,EIT 电阻抗成像&#xff08;Electrical Impedance Tomography,EIT&#xff09;是一种无创的以人体内部的电阻率分布为目标的重建体内组织图像的技术。人体是一个大的生物电导体&#xff0c;各组织、器官均有一定的阻抗&#xff0c;当人体的局部…

SLF4J基本使用

文章目录1. 日志门面2. SLF4J的使用2.1 SLF4J入门2.2 为什么要使用SLF4J作为日志门面&#xff1f;2.3 绑定日志的实现&#xff08;Binding&#xff09;2.4 logback 整合 slf4j2.5 log4j 整合 slf4j2.6 jul 整合 slf4j3. 桥接旧的日志框架&#xff08;Bridging&#xff09;3.1 S…

完全二叉树的权值

题目描述 给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1​,A2​,⋅⋅⋅AN​,如下图所示: 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输…

react用高阶组件优化文件结构 帮助建立高阶组件应用思路

其实高阶组件是一个将组件写的更灵活的方式&#xff0c;他的应用场景在业务开发中会非常多样 这里 我们演示一种 主要还是解决问题的思想最重要 或者是 这个不叫解决问题 而是设计组件结构的思路 我们来模拟一个场景 在src下有一个 components 文件夹目录 在 components 下有…

3.开发社区首页

数据库设计如下&#xff1a; 任务&#xff1a;开发社区首页&#xff0c;显示前十个帖子&#xff1b;开发分页组件&#xff0c;分页显示所有帖子。 开发流程&#xff1a;entity->dao->mapper.xml->service->controller 由于关注后端&#xff0c;所以未使用前后分离…

【Potplayer】如何用Potplayer实现对视频的局部缩放播放?如何用potplayer更舒心地播放竖屏视频?

一、问题背景 有时候我们从互联网上下载得到一个竖屏视频&#xff0c;用电脑播放时&#xff0c;左右两边都是黑的&#xff0c;电脑屏幕的高宽度没有得到良好应用。而如果恰好这个竖屏视频其实只有一小部分才是有效区域/重点内容&#xff0c;比如中央区域&#xff0c;上下区域都…

win10怎么玩经典扫雷?繁星软件园推荐大家试试Windows7Games吧,亲测好用的扫雷Win10电脑版下载!!!

扫雷Win10电脑版(Windows7Games)是专门为微软最新版本的Windows 10/11操作系统打造的一款非常不错的消除类PC休闲小游戏安装包&#xff0c; Windows7Games游戏安装包为中文版&#xff0c;包含经典扫雷、空当接龙、红心大战、国际象棋等微软低版本操作系统Windows自带的多款超级…

我的硕士前半生

本篇文章属于随笔类&#xff0c;它可能无法对你起到直接帮助&#xff0c;它只是我这个普通学生一年半以来的一些足迹与思考。本文首发于我的个人博客 Forever Young 我的本科像硕士&#xff0c;有实验室有工位&#xff0c;桌子超级大&#xff0c;有老师带有学长可以问。 我的硕…