【PAT(Advanced Level) Practice】1010 Radix(二分)

2023-05-16

链接:

https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536

题意:

有两个数 N 1 , N 2 N1,N2 N1N2,已知其中一个数的基数 r a d i x radix radix,问若要使 N 1 = = N 2 N1 == N2 N1==N2,那么另一个数的基数是多少。

思路:

假设:已知 N 1 N1 N1 的基数

我刚开始的思路是将 N 1 N1 N1 先转成 10 10 10 进制,然后再找到 N 2 N2 N2 中每位的数字中最大的那个数 r r r(因为 N 2 N2 N2 的进制一定 ≥ r + 1 \ge r+1 r+1),然后从 r + 1 r+1 r+1 开始并且每步 + 1 +1 +1 顺序去找 N 2 N2 N2 的进制(因为当数 N 2 N2 N2 给定时,它的进制越大, N 2 N2 N2 实际上就越大),对于每一个 r r r 比较在当前 r r r 进制下 N 2 10 进 制 N2_{10进制} N210 是否 = = = N 1 10 进 制 N1_{10进制} N110,如果 = = = 就找到了,直接输出。如果 N 2 10 进 制 > N 1 10 进 制 N2_{10进制} > N1_{10进制} N210>N110 则说明等式不可能成立,输出Impossible。(注释掉的代码)

这样做最后有一个测试点超时,我第一反应加上了快速幂,依旧超时。我测试了几次后发现是找 N 2 N2 N2 进制的 while 循环超时了,但是我没想到二分,直到百度之后,我才知道要用二分大法(被自己蠢哭了)。

正解: 上述思路不变,将找 N 2 N2 N2 的进制数 从 顺序查找 优化成 二分查找。二分的下界就是 r + 1 r+1 r+1, 上界设成 N 1 N1 N1 N 2 N2 N2 的基数 不可能大于已给 N 1 N1 N1,因为 如果 N 2 N2 N2 的基数 > N 1 > N1 >N1,那么只要 N 2 N2 N2 不是 0 0 0 N 2 N2 N2 就一定会大于 N 1 N1 N1,显然不合理)。
但是这样又出现了一个问题: N 2 N2 N2 比较大,在二分尝试比较大的基数的时候,会超 long long 的范围,产生溢出,使得判断条件不成立。(这也是百度知道的,当时已经不动脑了!!!)
解决溢出: 首先可以确定给出的已知数据 N 1 , N 2 N1,N2 N1,N2 最多 10 10 10 位数字,每位最大是 z z z,它们是不会溢出的。那么如果溢出(出现负值),就一定是基数上溢,基数取得过大了。因此多加一个判断即可(N2_10 < 0 || N2_10 > N1_10)。

在这里插入图片描述

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

LL qpow(LL x, LL n) {
	LL res = 1;
	while(n) {
		if(n&1) res *= x;
		x *= x;
		n >>= 1;
	}
	return res;
}

LL n2ten(string s, LL radix) {
	// cout<<"s : "<<s<<endl;
	LL res = 0;
	for (int i = s.size()-1; i >= 0; --i) {
		char now = s[i];
		char tmp = (now >= '0' && now <= '9')?'0':'a'-10;
		// cout<<"now-tmp : "<<now-tmp<<endl;
		// cout<<"pow(radix, s.size()-1-i) : "<<pow(radix, s.size()-1-i)<<endl;
		res += (now-tmp)*qpow(radix, s.size()-1-i);
	}
	return res;
}

void solve(string N1, string N2, LL radix) {
	LL N1_10 = n2ten(N1, radix);
	// cout<<"N1_10 : "<<N1_10<<endl;
	char maxE = *max_element(N2.begin(), N2.end());
	char tmp = (maxE >= '0' && maxE <= '9')?'0':'a'-10;
	LL r = maxE - tmp + 1;
	// cout<<"r : "<<r<<endl;
	// while(1) { // TLE
	// 	LL N2_10 = n2ten(N2, r);
	// 	// cout<<"N2_10 : "<<N2_10<<endl;
	// 	if(N2_10 > N1_10) {
	// 		cout<<"Impossible"<<endl;
	// 		return ;
	// 	}
	// 	if(N2_10 == N1_10) {
	// 		cout<<r<<endl;
	// 		return ;
	// 	}
	// 	r++;
	// }
	LL s = r, t = max(s, N1_10); 
	// N2 的基数 不可能大于已给 N1,因为 如果 N2 的基数 > N1,那么只要 N2 不是 0,N2 就一定大于 N1,显然不合理
	while(s <= t) {
		LL m = (s+t) >> 1;
		LL N2_10 = n2ten(N2, m);
		if(N2_10 == N1_10) {
			cout<<m<<endl;
			return ;
		}
		if(N2_10 < 0 || N2_10 > N1_10) t = m-1; 
		// 溢出,给出的已知数据(N1,N2)是不会溢出的,那么只要是取值为负的,全部是上溢,基数取得过大了。
		else s = m+1;
	}
	cout<<"Impossible"<<endl;
}

int main(int argc, char const *argv[])
{
	string N1, N2;
	LL tag, radix;
	cin>>N1>>N2>>tag>>radix;
	if(tag == 2) {
		swap(N1, N2);
	}
	solve(N1, N2, radix);
	return 0;
}

参考链接

  1. 1010. Radix (25)-PAT甲级真题(二分法)
  2. 1010 Radix (25)(25 分)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【PAT(Advanced Level) Practice】1010 Radix(二分) 的相关文章

  • 数学(三) -- LC[1010]&[1015] 可被 K 整除的最小整数

    1 可被 K 整除的最小整数 1 1 题目描述 题目链接 xff1a https leetcode cn problems smallest integer divisible by k description 1 2 思路分析 模运算 如
  • 【leetcode】107. 二叉树的层次遍历 II(binary-tree-level-order-traversal-ii)(BFS)[简单]

    链接 https leetcode cn com problems binary tree level order traversal ii 耗时 解题 xff1a 20 min 题解 xff1a 2 min 题意 给定一个二叉树 xff0
  • error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2

    错误原因 xff1a qtmain lib qtmain win obj error LNK2038 检测到 ITERATOR DEBUG LEVEL 的不匹配项 值 0 不匹配值 2 xxxx obj 中 值 0 不匹配值 2表示当前链接
  • error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”

    报错1 xff1a error LNK2038 检测到 ITERATOR DEBUG LEVEL 的不匹配项 值 0 不匹配值 2 解决 xff1a xff08 1 xff09 工程的模式和库的模式不一致 xff0c 工程为Debug模式
  • PAT 1005 Spell It Right

    Given a non negative integer N your task is to compute the sum of all the digits of N and output every digit of the sum
  • 使用 Fabric 和 Ansible 自动化 Django 部署

    目录 设置和配置 Fabric Setup 设置 SSH 密钥 强化用户密码 安装 Ansible 依赖项 将 SELinux 设置为宽容模式 升级服务器 完整性检查 Ansible Primer 剧本 示例手册 Playbook Setu
  • 7-10 链表去重(25 分)

    给定一个带整数键值的链表 L 你需要把其中绝对值重复的键值结点删掉 即对每个键值 K 只有第一个绝对值等于 K 的结点被保留 同时 所有被删除的结点须被保存在另一个链表上 例如给定 L 为 21 15 15 7 15 你需要输出去重后的链表
  • 交换机与路由器技术-35-端口多路复用PAT

    目录 一 端口多路复用 PAT 1 1 概述 1 2 端口映射 服务器映射 1 3 配置端口多路复用 1 3 1 方式一 使用单独的公网IP 第一步 定义内网和外网接口 第二步 定义内网地址范围 外网地址 1 使用ACL 允许某个范围的内网
  • 2020年十二月ccf-csp认证总结(内附个人题解)

    吐槽一下这个在线评测功能 平均四十分钟才能看到提交结果 本次成绩为100 100 0 30 20 最后两道题都是骗的分 提醒自己附代码的神奇图片 希望寒假有时间把没做出来的题目也再做一遍 csp官网更新出题目后 有路过的可以提醒我把题目加上
  • 实战演习(十)——通过LSTM训练天气污染程度预测模型

    我的公众号为 livandata 近期由于工作用到LSTM模型 借这个机会整理一下思路 在网上找了很多资料 受益匪浅 本文参考 https blog csdn net u012735708 article details 82769711
  • 1004. 成绩排名 (20)

    读入n名学生的姓名 学号 成绩 分别输出成绩最高和成绩最低学生的姓名和学号 输入格式 每个测试输入包含1个测试用例 格式为 第1行 正整数n 第2行 第1个学生的姓名 学号 成绩 第3行 第2个学生的姓名 学号 成绩 第n 1行 第n个学生
  • PAT题解——Basic Level——1094 谷歌的招聘

    题目链接 https pintia cn problem sets 994805260223102976 problems 1071785997033074688 题面 本题要求你编程解决一个更通用的问题 从任一给定的长度为 L 的数字中
  • PAT-1059 C语言竞赛

    1059 C语言竞赛 20 分 C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛 既然竞赛主旨是为了好玩 颁奖规则也就制定得很滑稽 0 冠军将赢得一份 神秘大奖 比如很巨大的一本学生研究论文集 1 排名为素数的学生将赢得最好的奖品 小黄
  • Pat刷题真题乙级(4)

    标题 前言 Pat乙级1013 组个最小数 Pat乙级1014 科学计数法 Pat乙级1017 打印沙漏 Pat乙级1018 人口普查 Pat乙级1019 旧键盘 前言 这个周末花了两天才写了五道题 嘿嘿 康康吧 Pat乙级1013 组个最
  • 1048 数字加密 (20 分)

    题目描述 本题要求实现一种数字加密方法 首先固定一个加密用正整数 A 对任一正整数 B 将其每 1 位数字与 A 的对应位置上的数字进行以下运算 对奇数位 对应位的数字相加后对 13 取余 这里用 J 代表 10 Q 代表 11 K 代表
  • 1032. 挖掘机技术哪家强(20)

    为了用事实说明挖掘机技术到底哪家强 PAT组织了一场挖掘机技能大赛 现请你根据比赛结果统计出技术最强的那个学校 输入格式 输入在第1行给出不超过105的正整数N 即参赛人数 随后N行 每行给出一位参赛者的信息和成绩 包括其所代表的学校的编号
  • 1001 害死人不偿命的(3n+1)猜想 (15 分)

    1001 害死人不偿命的 3n 1 猜想 15 分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1
  • 1055. 集体照 (25) PAT乙级真题

    1055 集体照 25 拍集体照时队形很重要 这里对给定的N个人K排的队形设计排队规则如下 每排人数为N K 向下取整 多出来的人全部站在最后一排 后排所有人的个子都不比前排任何人矮 每排中最高者站中间 中间位置为m 2 1 其中m为该排人
  • PAT B1014

    include
  • PAT (Basic Level) Practice (中文) B1034 有理数四则运算 (20 分)(C++)(分数四则运算)

    1034 有理数四则运算 20 分 本题要求编写程序 计算 2 个有理数的和 差 积 商 输入格式 输入在一行中按照 a1 b1 a2 b2 的格式给出两个分数形式的有理数 其中分子和分母全是整型范围内的整数 负号只可能出现在分子前 分母不

随机推荐