【蓝桥杯】X进制减法、贪心思想、小白专用

news2024/11/17 7:47:39

问题描述:

 

解题分析:

首先要搞明白 X 进制与 十 进制是如何转换的,以 X 进制321为例

题中说明,3 的进制为8,2的进制为10,1的进制为2

那么开始计算:

1就代表一个1

2的话是十进制,权值并不是10,而是2,因为只有低位满 2 时才会进1位,故此位所代表的数值转化为10进制为2*2=4

3的话是八进制,权值也不是8^2次方,而是10*2,因为只有最低位满2时,次低位才会进1,次低位只有满10时才会进1,故此位的权值为20,此位所代表的数值转化为10进制为20*3=60

三个位数代表的数值相加即为最后的10进制数,即为1+4+60=65

由以上分析可知一条最重要的原理就是

X 进制数的第 i 位的权值 = 低位进制之积

例如十进制中的百位的权值 = 10 *10 = 100

当搞明白X进制与十进制转化规则以后,来看题目:

题目意思是:两个不同位数的 X 进制数 A 和 B ,求每个位数的进制为多少时,A - B 的值最小,将结果对一个数取模输出;

首先要确定各个位数上的进制,因为进制数越大,表示的数也就越大,而题目要求两个数相减值最小,所以进制数越小越好,但是也不能无限制的小,进制数要比 A B 在该位数上的最大值大1,因为 M 进制所能表示的数的范围是 0 ~ M-1

其次为了防止在计算过程中,数据发生溢出,我们不能等到最后再对数取模输出,应该每处理一个位数的数据就对其进行处理

处理规则如下:

如果想求(5+6+7+8)% 6 的结果,为了防止数据溢出【当然这个数据不会溢出】

计算步骤应该为【(5%6)+(6%6)+(7%6)+(8%6)】%6  =  2

当然也可以写成【(5%6)+ (6%6)】% 6,拿这个结果加上(7%6),相加的结果再%6,依次相加即可,这样可以保证在数据相加的过程中,数据不会溢出

当然了,为了防止出现负数,可以使原数据加上 6 再对 6 取模,结果也是正确的,如下:

ans = ( 5 + 6 )% 6 = 5;ans =【 ans +( 7 + 6 )% 6 】% 6 = 0;

代码实现:

#include <bits/stdc++.h>
using namespace std;
const int vinf = 100010; 
typedef long long ll;
int a[vinf];    //存放a的每个数位上的数值 
int b[vinf];
int ans;     //存放最后的结果 
ll val[vinf];   //存储每个位数上的进制数
ll pro[vinf];   //计算每个位数的权值
const int pos = 1000000007; 
int main(){
	int N;    //最大进制数 
	cin>>N;
	int ma;   //A的位数 
	cin>>ma;
	for(int i=ma;i>=1;--i){
		cin>>a[i];
	} 
	int mb;   //B的位数 
	cin>>mb;
	for(int i=mb;i>=1;--i){
		cin>>b[i];
	}
	//开始处理
	int max_num = max(ma,mb);    //取最大值,假如A有5位,B有四位,那么要处理5位数据 
	for(int i=1;i<=max_num;++i){
		val[i] = max(max(a[i]+1,b[i]+1),2);
	}
//    int temp = 1;
//	pro[1] = 1;   //赋初值 
//	//用前缀积的方式计算每个位数的权值
//	for(int i=2;i<=max_num;++i){
//		temp *= val[i-1];
//		pro[i] = temp;
//	}      //确定每一位上所占的权值,例如:题中例题321中的3,权值为pro[3] = 20;
//	//开始正式计算A-B的值
//	//包含计算每一位的数值(权值*当前数)以及取模操作
//	for(int i=1;i<=max_num;++i){
//		int ttemp = (a[i]-b[i])*pro[i];
//		ttemp = (ttemp+pos)%pos;    //确保每位的计算结果不为负数 
//		ans = (ans+ttemp)%pos;    //确保ans永远比pos小 
//	}
	//以上不可行,但是可以通过样例 
	for(int i=max_num;i>=2;--i){
		ans = ((ans+a[i]-b[i])*val[i-1]) % pos;
	}
	ans += (a[1]-b[1]), ans %= pos;
	cout<<ans<<endl; 
	return 0;
}

确定每一位的权值的思路不可行,可能是因为数据的问题【会溢出】

其实以上那个思路也可以,但是前提是要对每个位数的权值进行取模,别让数据太大,其次要比较a【i】与b【i】的大小,如果前者小的话,要向前借位;

改良版本:

#include <bits/stdc++.h>
using namespace std;
const int vinf = 100010; 
typedef long long ll;
int a[vinf];    //存放a的每个数位上的数值 
int b[vinf];
ll ans;     //存放最后的结果 
ll val[vinf];   //存储每个位数上的进制数
ll pro[vinf];   //计算每个位数的权值
const int pos = 1000000007; 
int main(){
	int N;    //最大进制数 
	cin>>N;
	int ma;   //A的位数 
	cin>>ma;
	for(int i=ma;i>=1;--i){
		cin>>a[i];
	} 
	int mb;   //B的位数 
	cin>>mb;
	for(int i=mb;i>=1;--i){
		cin>>b[i];
	}
	//开始处理
	int max_num = max(ma,mb);    //取最大值,假如A有5位,B有四位,那么要处理5位数据 
	for(int i=1;i<=max_num;++i){
		val[i] = max(max(a[i]+1,b[i]+1),2);
	}
	//包含计算每一位的数值(权值*当前数)以及取模操作
	ll base=1;
	for(int i=1;i<=max_num;++i){
		if(a[i]>=b[i]){
			ans += ((a[i]-b[i])*base)%pos;
		}
		else {
			a[i+1]--;
			a[i]+=val[i];
			ans += ((a[i]-b[i])*base)%pos;
		}
		ans %= pos;
		base *= val[i];
		//base %= pos;    //防止过大 
	}
	cout<<ans<<endl; 
	return 0;
}

//	//以上不可行,但是可以通过样例 
//	for(int i=max_num;i>=2;--i){
//		ans = ((ans+a[i]-b[i])*val[i-1]) % pos;
//	}
//	ans += (a[1]-b[1]), ans %= pos;


思路二:

先将 A 与 B 的高位数字相减,乘以下一位的进制数,就是当前为所代表的的数值,然后拿着这个位的数值加上其他位的数值,但是在与其他位相加之前可以先取模,控制数据范围不让其溢出;

为了防止产生负数:还可以加上pos再取模!

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

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

相关文章

【论文精读】COLING 2020 -带有对偶关系图注意力网络的事件检测模型

【论文精读】COLING 2020 -带有对偶关系图注意力网络的事件检测模型 【论文原文】&#xff1a;Event Detection with Dual Relational Graph Attention Networks 【作者信息】&#xff1a;Jiaxin Mi and Po Hu and Peng Li 论文&#xff1a;https://aclanthology.org/2022.c…

Spring系列(六) --- SpringBoot 与 Servlet 的比较及 Spring 读取配置文件的方式

SpringSpringBoot VS ServletSpring 读取配置文件的方式yml 和 properties 的区别SpringBoot VS Servlet Spring 读取配置文件的方式 1 Value 注解获取单个配置项 如在 yml 中定义一个 qq 音乐的 token; 然后输出, 如下: 2 针对对象的读取: ConfigurationProperties 在 yml 中…

笔记本电脑连接不上WiFi怎么办?4个实用解决方法!

案例&#xff1a;笔记本电脑连接不上WiFi怎么办 “朋友们&#xff0c;想问问大家知道为什么我的笔记本电脑连接不上WiFi呢&#xff1f;试了好几遍还是无法连接&#xff0c;遇到这种情况我应该怎么解决呢&#xff1f;感谢大家&#xff01;” 在现代生活中&#xff0c;笔记本电…

HTTP协议详解(二)

目录 1.HTTP 响应详解 1.1认识状态码(status code) 1.2 认识响应报头(header) 1.3 认识响应正文(body) 2.构造 HTTP 请求 2.1 通过form表单构造请求 2.2 通过ajax构造请求 2.3 使用第三方工具构造请求 开始之前我们先复习一下http协议格式 1.HTTP 响应详解 我们先抓包…

【JavaScript】四个常用功能/案例:表格排序 | 替换链接 | 倒计时 | 双色球机选一注

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&am…

《文章复现》考虑用户舒适度的冷热电多能互补综合能源系统优化调度

说明书 免费&#xff1a;https://download.csdn.net/download/qq_50594161/87625438 MATLAB代码&#xff1a;考虑用户舒适度的冷热电多能互补综合能源系统优化调度 关键词&#xff1a;用户舒适度 综合能源 PMV 优化调度 参考文档&#xff1a;《冷热电气多能互补的微能源网鲁…

点击开关按钮,js实现电灯开关效果

初识js&#xff0c;跟大家分享js实现电灯开关灯效果的具体代码&#xff0c;利用简单的htmljs模拟电灯开关的小案例。 首先进行案例分析&#xff1a; 1.获取图片属性 2.判断变量的值 3.点击时切换图片 通过点击按钮实现电灯开关 以下是两张需要的图片&#xff0c;接下来添加…

vue3路由配置及路由跳转传参

1、安装路由 npm i vue-router 2、编写需要展示的路由 在src目录下创建pages文件夹&#xff0c;里面创建两个vue文件命名为student.vue,person.vue 分别编写两个vue文件 student.vue和person.vue <template>学生 </template><script setup></script…

后端架构token授权认证机制:spring security JSON Web Token(JWT)简例

后端架构token授权认证机制&#xff1a;spring security JSON Web Token&#xff08;JWT&#xff09;简例 在基于token的客户端-服务器端认证授权以前&#xff0c;前端到服务器端的认证-授权通常是基于session&#xff0c;自从token机制出现并流行起来后&#xff0c;基于token…

微信小程序详细登录流程(图解+代码流程)

&#x1f482; 个人网站:【紫陌】【笔记分享网】&#x1f485; 想寻找共同学习交流、共同成长的伙伴&#xff0c;请点击【前端学习交流群】微信小程序的登录和web端的登录有一点是不同的&#xff0c;小程序需要和微信的服务通信验证。1.小程序登录流程官网图官网图地址2.认识op…

【node进阶】深度解析Express框架--路由、中间件

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

完全卸载vscode

背景 由于插件崩溃、不正确操作等导致vscode出现异常现象&#xff0c;如&#xff1a;代码高亮失效、无法进行转到定义等&#xff0c;此时的vscode就需要重新完全卸载删除再安装&#xff0c;恢复初始化。 步骤 1、卸载vscode&#xff1a; 任何方法都可以&#xff0c;比如win…

vue 遍历数组

1.forEach(): 遍历数组 需要一个回调函数作为参数 回调函数的形参: ①. value: 遍历数组的内容 ②.index: 对应数组的索引 ③.array: 数组本身 forEach() 方法主要是用于调用数组的每个元素&#xff0c;并将元素传递给回调函数。 注:对于空数组不会执行回调函数 语法: ar…

jsoup 框架的使用指南

概述 参考&#xff1a; 官方文档jsoup的使用JSoup教程jsoup 在 GitHub 的开源代码 概念简介 jsoup 是一款基于 Java 的 HTML 解析器&#xff0c;它提供了一套非常省力的 API&#xff0c;不但能直接解析某个 URL 地址、HTML 文本内容&#xff0c;而且还能通过类似于 DOM、CS…

刷题日常计~JS①

作者 : SYFStrive 博客首页 : 点击跳转HomePage &#x1f4dc;&#xff1a; 初编程JavaScript之每天10题 &#x1f449; 从质变到量变&#x1f4aa; &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f5…

Vue常见报错及解决方案

写代码的过程中一定会遇到报错&#xff0c;遇到报错不要担心&#xff0c;认真分析就可以解决报错&#xff0c;同时积累经验&#xff0c;早日成为大牛&#x1f44d; 本文会整理一些在编码过程中遇到的常见报错&#xff0c;共同学习。 一、报错结构 二、常见问题总结及解决方法 …

微信小程序跳转外部链接

微信小程序跳转外部链接 在开发小程序过程中&#xff0c;我们可能会有这样的需求&#xff0c;在小程序中打开H5或者外部链接 实现方法如下&#xff1a; 1、配置业务域名 小程序管理后台——开发(开发管理)——开发设置&#xff1a;新增业务域名 在这里将你需要的外部链接域…

超详细的正则表达式的使用方法,学不会找我

正则表达式的基本使用 前言&#xff1a; 在我们开发过程中&#xff0c;有很多地方需要用到正则表达式。如验证用户登录信息、手机号、邮箱地址等等。那你都会正则表达式的哪几个方法呢&#xff1f; 首先&#xff0c;我们要知道什么是正则表达式。 正则表达式的定义&#xff…

节流还在用JS吗?CSS也可以实现哦

函数节流是一个我们在项目开发中常用的优化手段&#xff0c;可以有效避免函数过于频繁的执行。一般函数节流用在scroll页面滚动&#xff0c;鼠标移动等。 为什么需要节流呢&#xff0c;因为触发一次事件就会执行一次事件&#xff0c;这样就形成了大量操作dom,会出现卡顿的情况…

ES6模块化(默认导入导出、按需导入导出、直接导入)

一、介绍ES6模块化 ES6 模块化规范是浏览器端与服务器端通用的模块化规范&#xff0c;ES6模块化的出现前端开发者不再需要额外的学习其他的模块化规范。 二、ES6 模块化规范中定义&#xff1a; 1.每个 js 文件都是一个独立的模块 2.导入其它模块成员使用 import 关键字 3.向外…