进制算法题(进制转换、Alice和Bob的爱恨情仇)

news2024/9/20 6:33:13

 进制的本质

对于一个十进制数字,比如说153,其本质是每一个数位上的数字乘上这一位上的权重,即:153=(1x10^{2})+(5x10^{^{1}})+(3 x10^{0})而二进制,只不过是把10换成了2,任意一个非负整数都有唯一的一个二进制表示:
153_{10}=(10011001)_{2}
在计算机中,数字均通过二进制补码表示,所以学习进制转换尤为重要。

将任意进制转换为十进制

假设给了一个数组来表示一个k进制(假设K>10)的整数,我们该如何得到它的十进制数?

i = 1,[ x = 1 \times k^0 ]

i = 2,[ x = 1 \times k^1 + 3 \times k^0 ]

i =3,[ x = 1 \times k^2 + 3 \times k^1 + 10 \times k^0 ]

ll x = 0;
for (int i = 1; i <= n; ++i)
{
	x = x * k + a[i];
}
cout << x << '\n';

一般来说,这个k进制的数组可以通过对输入字符串的处理得到。

ll x; cin >> x;
while (x)a[++cnt] = x % k, x /= k;
reverse(a + 1, a + 1 + cnt);

例如十进制的11转换为二进制,根据这个规则得到的a数组为[1,1,0,1],而实际上11的二进制为[1,0,1,1]。

一、进制

问题描述
请问十六进制数 2021ABCD 对应的十进制是多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解题思路

  1. 从右至左给每一位编号,最右边为第0位,依次为第1位、第2位……对于“2021abcd”,d是第0位,c是第1位,依此类推。

  2. 每一位上的数字乘以16的相应次方(权重)。例如,d(十进制值)乘以16^0,c乘以16^1,b乘以16^2,a乘以16^3,1乘以16^4,2乘以16^5,0乘以16^6(注意这里的0不影响结果),2乘以16^7。

  3. 将步骤2中得到的所有乘积相加,得到最终的十进制值。

二、进制转换

题目描述
给定一个 N 进制数 S,请你将它转换为 M 进制。
输入描述
第一行为一个整数 T,表示测试数据数量。(1 ≤ T < 10°)每个测试用例包含两行,第一行包含两个整数 N,M第二行输入一个字符串 S,表示 N 进制数。
数据范围保证:2<N,M<16,若N >10,则用 A~ F 表示字码10 ~ 15。保证 S 对应的十进制数的位数不超过 10。
输出描述
输出共 T,每行表示一组数据的答案

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1001;
int a[N];
char ch[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };


void solve() {
    int n, m; cin >> n >> m;
    string s; cin >> s;
    int len = s.length();
    s = "#" + s; // 注意这里应该是小写 s  
    for (int i = 1; i <= len; ++i) {
        if ('0' <= s[i] && s[i] <= '9') { // 注意这里应该是 '0' 而不是 'e'  
            a[i] = s[i] - '0'; // 将字符转换为数字  
        }
        else {
            a[i] = s[i] - 'A' + 10; // 将大写字母转换为数字(A=10, B=11, ...)  
        }
    }
    ll x = 0;
    for (int i = 1; i <= len; ++i) {
        x = x * n + a[i];
    }

    string ans;
    while (x) {
        ans += ch[x % m]; // 假设 ch 数组的目的是将数字转换为大写字母(这里直接转换了)  
        x /= m;
    }
    reverse(ans.begin(), ans.end()); // 反转字符串以得到正确的顺序(如果需要的话)  
    cout << ans << '\n'; // 输出结果并添加换行符(这里 '\n' 是正确的,但通常我们会直接写 << endl)  
}



int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _; cin >> _;
    while (_--)solve();
    return 0;
}

三、Alice和Bob的爱恨情仇

问题描述

Bob和Alice通过博弈的方式来吃掉小饼干。他们将小饼干分成n堆,每堆有αi个小饼干。他们轮流对这些饼干进行操作,每次从一堆中拿出k^m个小饼干(k为奇数且m≥0,且km不能超出该堆的总数)。当一方操作后没有剩余的小饼干,则该方获胜。Alice先手,两人都会以最佳方法取饼干。请问谁能赢?

输入格式

第一行:两个正整数n(1≤n≤2×10^5)和k(1≤k≤10^9),分别表示饼干的堆数和每次取出饼干的底数。
第二行:n个整数,第i个表示第i堆小饼干有αi(1≤αi≤10^6)个小饼干。
输出格式

输出一行,包含一个字符串,表示Alice和Bob之中获胜的那个人。

诈骗题。
注意到 k 为奇数,而且每次至少可以取走一个石子。这意味着实际上
k^m 毫无意义,只与那一堆石子的奇偶数有关。更进一步,只与所有石
子堆的石子数之和的奇偶有关,若是奇数,则 Alice 胜,否则 Bob 胜。
时间复杂度 O(n)。

解题思路

k 是奇数
当 k 是奇数时,每次可以取走 (k^m) 个小饼干(m 是非负整数),由于 (k^m) 总是奇数(奇数的任何非负整数次幂都是奇数),因此:

如果一开始有 x 个小饼干,且 x 是奇数,那么先手总是可以取走 (k^m) 个小饼干,使得剩下的小饼干数量是偶数。然后无论后手如何取,先手总是可以取走 1 个小饼干,保持剩余小饼干数量为偶数。最终,先手将取走最后一个小饼干,赢得游戏。
如果一开始有 x 个小饼干,且 x 是偶数,那么无论先手如何取,后手总是可以取走 1 个小饼干,使得剩余小饼干数量为奇数。然后先手无论如何取,后手都可以取走 (k^m) 个小饼干,保持剩余小饼干数量为奇数。最终,后手将取走最后一个小饼干,赢得游戏。

在这道题中,题目还特别强调了 k 是奇数,由此我们可以进行大胆的推测这个博弈的结果跟奇偶数有很大关系。 由于每次取值都是 k 的幂次方,由于 k 是奇数,故每次取的数也将是奇数。

总结:

在一个奇数堆中,由于每次取不超过总数的奇数个数的饼干,所以我们到最后取完的时候一定会取奇数次,同理可得,在一个偶数堆中则是取偶数次。

故可知对于 (1,2,…,)(a1​,a2​,…,an​) 会有所对应的 (1,2,…,)(b1​,b2​,…,bn​) ,其中 bi​ == ( ai​ % 22 ) ,当 bi​ 为 1 时代表取奇数, bi​ 为 0 时代表取偶数。

由此可得出 ans= (1,2,…)(b1​,b2​,…,bn​) % 2,其中 ans 为 1 时代表总取数为奇数,即 Alice 赢,ans 为 0 时代表总取数为偶数,即 Bob 赢。

#include <bits/stdc++.h>

void solve(const int &Case) {
    int n, k;
    std::cin >> n >> k;
    int ans = 0;
    for (int i = 0; i < n; i++) {
        int x;
        std::cin >> x;
        ans ^= x & 1;
    }
    if (ans > 0)std::cout << "Alice\n";
    else std::cout << "Bob\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int T = 1;
    for (int i = 1; i <= T; i++)solve(i);
    return 0;
}

或者:

#include <iostream>
using namespace std;
long long ans,n,k,x;
int main()
{
    cin>>n>>k;
    while(n--)
    {
        cin>>x;
        ans+=(x%2); 
        
    }
    if(ans%2)
    {
        cout<<"Alice";
    }
    else
    {
        cout<<"bob";
    }
    return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

助力智能化农田作物除草,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中&#xff0c;关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了&#xff0c;结合智能化的设备可以实现只能除草等操作&#xff0c;玉米作物场景下的杂草检测我们则少有涉及&#xff0c;这里本文的主要目的就是想要基于DETR模型来开发构建玉米…

YUNBEE-【技术分析】postgres中B-tree 索引结构深度解析

注: 本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 一、B-tree索引的结构 在PostgreSQL中&#xff0c;B-tree索引的结构包括几种类型的页面&#xff1a;meta page、root page、bran…

C语言学生成绩信息管理系统【结构体+文本】

功能描述&#xff1a; 1、录入成绩 2、显示不及格学生信息 3、统计每档学生数量 4、总成绩统计 代码&#xff1a; #include<stdio.h>#define N 30//结构体&#xff1a;typedef struct STUDENT{char id[10];//学号char name[20];//姓名float score[3];//三门成绩,分别代…

张俊将出席用磁悬浮技术改变生活演讲

演讲嘉宾&#xff1a;张俊 空压机销售总监 亿昇(天津)科技有限公司 演讲题目&#xff1a;用磁悬浮技术改变生活 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确“低碳经济”新的战略目标&#xff0c;热能产业是能源产业和…

vite打包构建时环境变量(env)生成可配置的js文件

现实需求 在vite开发过程中&#xff0c;一些变量可以放在.env&#xff08;基础公共部分变量&#xff09;.env.dev&#xff08;开发环境&#xff09;、.env.production&#xff08;生产环境&#xff09;中管理&#xff0c;通常分成开发和生产两个不同的配置文件管理&#xff0c…

AcWing 787. 归并排序 解题思路及代码

先贴个题目&#xff1a; 以及原题链接&#xff1a;787. 归并排序 - AcWing题库https://www.acwing.com/problem/content/789/纯板子题&#xff0c;先贴代码吧&#xff0c;根据代码讲思路&#xff1a; #include <iostream> using namespace std;const int N 1e5 10; in…

备战蓝桥杯---状态压缩DP基础1之棋盘问题

它只是一种手段&#xff0c;一种直观而高效地表示复杂状态的手段。 我们先来看一道比较基础的&#xff1a; 直接DFS是肯定不行&#xff0c;我们发现对某一行&#xff0c;只要它前面放的位置都一样&#xff0c;那么后面的结果也一样。 因此我们考虑用DP&#xff0c;并且只有0/…

【three.js】搭建本地静态服务器 查询API文档使用

目录 一、为什么要搭建本地静态服务器呢&#xff1f; 二、下载three.js文件包 三、vscode配置live-server插件 一、为什么要搭建本地静态服务器呢&#xff1f; 平时学习Three.js&#xff0c;如果你想预览代码3D效果、查询API文档等&#xff0c;咱们需要提供一个本地静态服务…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第12章 项目质量管理(五)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

​​Procedural Sky - Builtin LWRP URP - Jupiter

Jupiter是一个轻量级的单通道着色器,可帮助您立即创建动态天空盒,深度关注低多边形和风格化场景,可在桌面、移动和VR应用程序上运行良好,为您节省大量时间和精力! Jupiter完全支持轻量级、通用和内置渲染管道,并提供各种设置供您自定义。这些功能可以通过简单的切换轻松打…

【OpenGL编程手册-04】详细解释着色器

着色器 目录 一、说明二、着色器语言GLSL2.1 典型的着色器代码2.2 数据类型2.2.1 向量 2.3 输入与输出2.3.1 顶点着色器2.3.2 片段着色器 2.4 Uniform2.5 函数后缀含义2 .6 更多属性&#xff01; 三、我们自己的着色器类四、从文件读取五、 编译着色器练习 一、说明 在Hello T…

IK分词器的入门使用

目录 1. 前言2. IK分词器的特点3. 引入IK分词器的依赖4. 示例代码5.结论 1. 前言 中文分词是将连续的中文文本切分成一个个独立的词语的过程&#xff0c;是中文文本处理的基础。IK分词器是一个高效准确的中文分词工具&#xff0c;采用了"正向最大匹配"算法&#xff…

ORACLE 基础

一.ORACLE简介 1.1什么是oracle ORACLE 数据库系统是美国 ORACLE 公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。…

c++_leetcode_寻找峰值

目录 一、寻找峰值的示例 二、官方实现代码及解释 1、官方测试结果&#xff1a; 2、代码解释&#xff1a; 3、解题思路&#xff1a; 三、我的暴力解决 1、测试一&#xff1a; 2、测试二&#xff1a; 3、最终“暴力求解”代码&#xff1a; 4、官网提交测试通过&#xf…

Vue中<style scoped lang=“scss“>的含义

这段代码中的<style scoped lang"scss">是HTML和Vue框架结合使用时常见的一个模式&#xff0c;具体含义如下&#xff1a; scoped&#xff1a;这是一个Vue.js特有的属性&#xff0c;用来指定样式只应用于当前组件的元素。没有这个属性时&#xff0c;样式会全局应…

Day08-【Java SE进阶】面向对象高级二——多态、final、抽象类、接口

一、多态 对象多态多态是在继承/实现情况下的一种现象&#xff0c;表现为对象多态和行为多态。 对象多态&#xff1a;一个人可以是学生也可以是老师&#xff0c;学生和老师都是人的子类&#xff0c;创建人对象让其指向不同的对象&#xff0c;称为对象多态&#xff0c;这里是向…

springcloud:3.1介绍雪崩和Resilience4j

灾难性雪崩效应 简介 服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 原因 1.服务提供者不可用(硬件故障、程序bug、缓存击穿、用户大量请求) 2.重试加大流量(用户重试,代码逻辑重试) 3.服…

NebulaGraph入门

感谢阅读 官方文档链接NebulaGraph简介nGQLnGQL简介占位标识符和占位符值注释实列大小写区分关键字 基本概念以及相关代码实现补充说明图空间语法以及列子创建克隆官方示例代码(创建并克隆)USE语句指定图空间时查看所有SPACESPACE详情CLEAR SPACE删库跑路&#xff08;看玩笑的说…

CPU,ISA架构,CPU位数与内存

CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09;是计算机系统中的主要组件之一&#xff0c;负责执行程序指令并进行数据处理。我们之前已经介绍了CPU与冯诺依曼机CPU与冯诺依曼机-CSDN博客&#xff0c;而ISA&#xff08;Instruction Set Architectu…

EasyRecovery数据恢复软件2024最新版包括Windows和Mac

EasyRecovery数据恢复软件适用于多种环境和使用场景。首先&#xff0c;它适用于各种操作系统&#xff0c;包括Windows和Mac。无论用户使用的是哪种操作系统&#xff0c;都可以使用该软件进行数据恢复。 其次&#xff0c;EasyRecovery支持从各种存储设备和媒介中恢复数据&#…