圈乘运算问题

题目描述

关于整数的2元圈乘运算 ⊕ ⊕ 定义为 X ⊕ ⊕ Y = 十进制整数 X 的各位数字之和 × \times × 十进制整数 Y 的最大数字 + Y 的最小数字。例如, 9 ⊕ 30 = 9 × 3 + 0 = 27 9⊕30=9\times3+0=27 930=9×3+0=27
对于给定的十进制整数 X 和 K,由 X 和 ⊕ ⊕ 运算可以组成各种不同的表达式。试设计一个算法,计算出由 X 和 ⊕ ⊕ 运算组成的值为 K 的表达式最少需用多少个 ⊕ ⊕ 运算。

算法设计:给定十进制整数 X 和 K ( 1 ≤ X , K ≤ 1 0 20 1≤X,K≤10^{20} 1X,K1020) 。计算由 X
⊕ ⊕ 运算组成的值为 K 的表达式最少需用多少个 ⊕ ⊕ 运算。

输入描述

每一行有两个十进制整数 X 和 K。
最后一行是 0 0

输出描述

将找到的最少 ⊕ ⊕ 运算个数输出,如果没有答案,输出No answer

思路分析

首先我们定义 c n t x , s u m x , m x x , m i x , n u m x cnt_x,sum_x,mx_x,mi_x,num_x cntx,sumx,mxx,mixnumx 分别为 x x x 的位数,各位数字之和,各位数字中的最大值,各位数字中的最小值,进行 ⊕ ⊕ 运算能得到的最大值。
p a r t 1 : part 1: part1:
c n t x ≥ 3 cnt_x \ge 3 cntx3 时, X ⊕ X ≤ X X⊕X\le X XXX 恒成立。证明如下:
∵ m x x , m i x ≤ 9 , x 各位数字 ≤ 9 \because mx_x,mi_x \le 9,x各位数字 \le 9 mxx,mix9,x各位数字9
∴ s u m x ≤ c n t x × 9 × 9 + 9 → c n t x × 81 + 9 \therefore sum_x \le cnt_x\times9\times9+9 \to cnt_x\times81+9 sumxcntx×9×9+9cntx×81+9
∵ c n t x ≥ 3 , m i x ≤ 9 \because cnt_x\ge3,mi_x\le9 cntx3,mix9
∴ c n t s u m x ≤ c n t x \therefore cnt_{sum_x}\le cnt_x cntsumxcntx
∴ X ⊕ X ≤ X \therefore X⊕X\le X XXX
反之, X ⊕ X ≥ X X⊕X \ge X XXX 恒成立
p a r t 2 : part 2: part2:
1 1 1 中结论我们可以很容易想到,每个数都有对应的 ⊕ ⊕ 运算最大值。当结果 k ≥ n u m x k\ge num_x knumx时,这个 k k k 一定不能通过 x x x ⊕ ⊕ 运算得到。需要注意的是, c n t x ≤ 2 cnt_x\le 2 cntx2 时,我们需要保证 k = 171 k = 171 k=171,因为一位和两位的数字在 ⊕ ⊕ 运算可以不断变大。

因此我们定义 f i f_i fi 表示 ⊕ ⊕ 运算结果为 i i i 时的最小 ⊕ ⊕ 数。
那么对于每个 < i , j , k > <i,j,k> <i,j,k> 数对若 i = s u m j ∗ m x k + m i k i=sum_j*mx_k+mi_k i=sumjmxk+mik,有转移方程如下:
f i = m i n ( f i , f j + f k + 1 ) f_i=min(f_i,f_j+f_k+1) fi=min(fi,fj+fk+1)
当我们依次匹配且此时不会对任意 f i f_i fi 改变时,结果不会继续改变,此时我们输出 f k f_k fk 即为答案。

代码

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

#define IOS ios::sync_with_stdio(false), cin.tie(0);

typedef long long ll;
typedef unsigned long long ull;

struct node
{
    node() : mx(0), mi(9), s(0){};
    node(ull num) : mx(0), mi(9), s(0)
    {
        ull tmp = num;
        while (tmp)
        {
            ll t = tmp % 10;
            mx = max(mx, t);
            mi = min(mi, t);
            s += t;
            tmp /= 10;
        }
    };
    ll s, mx, mi;
};

void solve()
{
    ull m, k;//注意1e20超出了ll
    while (cin >> m >> k && (m || k))//多组输入
    {
        if (m == k)//对于m==k的特判
        {
            cout << "0\n";
            continue;
        }
        //求出最大结果
        ll n = (log10(m) + 1) * 81 + 9; // 1629
        //对于位数小于等于2的特判
        if (n < 2 * 81 + 9)
            n = 2 * 81 + 9; // 171
        if (k > n)
        {
            cout << "No answer\n";
            continue;
        }//当k大于最大结果时,无效
        vector<node> a(n + 10);
        vector<ll> f(n + 10, inf);
        for (int i = 1; i <= n; i++)
            a[i] = node(i);//构造1-n各位的元素
        a[0] = node(m);//将m放入位置0
        f[0] = 0;
        bool flag = true;
        while (flag)
        {
            flag = false;
            for (int i = 0; i <= n; i++)
            {
                if (f[i] == inf)
                    continue;
                //找到可选择的i
                for (int j = 0; j <= n; j++)
                {
                    if (f[j] == inf)
                        continue;
                    //找到可选择的j
                    ll k = a[i].s * a[j].mx + a[j].mi;
                    //i⊕j
                    if (f[k] > f[i] + f[j] + 1)
                    {
                        f[k] = f[i] + f[j] + 1;
                        flag = true;
                    }
                }
            }
        }
        if (f[k] == inf)
            cout << "No answer\n";//当结果仍为inf,说明k未被覆盖过,即无效
        else
            cout << f[k] << "\n";
    }
}

int main()
{
    int T = 1;
    // cin>>T;
    while (T--)
        solve();
    return 0;
}

/*
oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxox
x                                                                                      o
o       _/_/_/_/                                                              _/       x
x      _/                                                                              o
o     _/_/_/_/ _/  _/_/   _/_/   _/_/_/ _/_/   _/_/_/     _/_/    _/_/_/    _/ _/   _/ x
x    _/       _/_/     _/    _/ _/   _/   _/  _/    _/ _/    _/  _/    _/  _/   _/ _/  o
o   _/       _/       _/    _/ _/   _/   _/  _/    _/ _/    _/  _/    _/  _/    _/_/   x
x  _/       _/         _/_/   _/   _/   _/  _/_/_/     _/_/ _/ _/    _/  _/      _/    o
o                                          _/                           _/      _/     x
x                                         _/                        _/_/       _/      o
o                                                                                      x
xoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo
*/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇舟问卷:做国外问卷调查需要准备些什么

大家好&#xff0c;我是汇舟问卷。海外问卷调查在这两年一直是个热门的项目&#xff0c;做这个项目所需要投入的成本是多少&#xff1f;如果我们要做这个项目需要准备什么以及要花多少钱&#xff1f;今天我来为大家讲解一下: 首先准备一台电脑 (内存建议16G&#xff0c;处理器…

C语言进阶:进阶指针(下)

一、 函数指针数组 我们都知道 数组是一个存放相同类型数据的存储空间 那我们已经学习了指针数组 那么函数有没有对应的指针数组呢&#xff1f; 如果有那应该怎么定义呢&#xff1f; 1. 函数指针数组的定义 我们说 函数指针数组的定义 应该遵循以下格式 int (*p[10])(); 首…

UniAD:以规划为导向的端到端自动驾驶

文章链接 这个文章是CVPR2023 Best Paper https://arxiv.org/pdf/2212.10156 提出背景 以往的自动驾驶多数是为不同的任务场景设计部署单独的模型&#xff0c;这样子组成的系统会很复杂如图a。 图b这是多任务共享一个主干&#xff0c;但还是要分离训练&#xff0c;而且不是…

03_Scala变量和数据类型

文章目录 [toc] **变量和数据类型****1.注释****2.变量和常量****3. 标识符的命名规范****4.scala的字符串****5.键盘输入****5.1 StdIn.readLine()****5.2 从文件中读取数据****5.3 Scala向外写数据** 变量和数据类型 1.注释 和Java完全一样 ** ** 2.变量和常量 var name…

外包干了4个月,技术退步明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

攻防世界 easyphp

本题主要利用的知识点是php绕过 一、PHP代码分析 首先先看一下代码 我们需要利用get方式上传3个参数a,b,c&#xff0c;这3个分别需要满足不同的条件: a&#xff1a;设置a值&#xff1b;值大于6000000&#xff1b;长度不超过3&#xff1b; b&#xff1a;设置b值&#xff1b;MD…

《QT实用小工具·三十五》基于PathView,Qt/QML做的一个可以无限滚动的日历控件

1、概述 源码放在文章末尾 改项目实现了基于PathView&#xff0c;Qt/QML做的一个可以无限滚动的日历控件&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Bu…

基于Spring Boot的口腔管理平台设计与实现

基于Spring Boot的口腔管理平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面图&#xff0c;管理员登录进入口腔管理平…

Spring Cloud OpenFeign使用

OpenFeign源于Netflix的Feign&#xff0c;是http通信的客户端。屏蔽了网络通信的细节&#xff0c;直接面向接口的方式开发&#xff0c;让开发者感知不到网络通信细节。 所有远程调用&#xff0c;都像调用本地方法一样完成。 Spring Cloud OpenFeign 是 Spring Cloud 对 Feign …

Unity AssetsBundle打包

为什么要使用AssetsBundle包 减少安装包的大小 默认情况下&#xff0c;unity编译打包是对项目下的Assets文件夹全部内容进行压缩打包 那么按照这个原理&#xff0c;你的Assets文件夹的大小将会影响到你最终打包出的安装包的大小&#xff0c;假如你现在正在制作一个游戏项目&…

Aigtek:功率信号源是什么东西

功率信号源是一种电子设备&#xff0c;它可以提供可控的、稳定的高功率输出信号。通常用于测试和校准功率放大器、天线等设备&#xff0c;以及进行无线通信、雷达和卫星导航等应用中。下面将详细介绍功率信号源的概念、功能和特点。 功率信号源的概念 功率信号源是指能够产生可…

SCSS的基本使用(一)

目录 一、使用&符号来引用父选择器 二、scss的语法 三、变量&#xff08;Variables&#xff09; 四、嵌套&#xff08;Nesting&#xff09; 五、mixin 和 include 六、extend 继承 七、import 与 Partials 八、if简单判断 九、if复杂判断 一、使用&符号来引用父…

鸿蒙云函数调试坑点

如果你要本地调试请使用 const {payload, action} event.body/** 本地调试不需要序列化远程需要序列化 */ // const {payload, action} JSON.parse(event.body) const {payload, action} event.body 注意: 只要修改云函数&#xff0c;必须上传云函数 如果使用 const {pay…

【服务器部署篇】Jenkins配置后端工程自动化部署

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

【亲测对比】大厂云服务器2-64G对比表 不卡顿 幻兽帕鲁 我的世界 雾锁王国 饥荒联机版 英灵神殿通用

更新日期&#xff1a;4月26日&#xff08;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】2024年-幻兽帕鲁服务器专…

C语言系列文章 | 初识C语言

首先分为几个方面来和各位读者介绍C语言&#xff0c;并在之后的学习过程中不断地和各位读者去分享我学习的经历。 坐好&#xff0c;发车咯~目录如下&#xff1a;1. C语言是什么&#xff1f;2. C语言的历史和辉煌3. 编译器的选择VS20224. VS项目和源⽂件、头⽂件介绍5. 第⼀…

关于java对接微信公众号(对接百度AI实现图片文字识别,对接聚合数据实现笑话、谜语大全,成语接龙等功能)

前言&#xff1a; 只是自己学习使用&#xff0c;所以有点不规范&#xff0c;请见谅 本文直接附上源码与效果图&#xff0c;具体操作步骤请参考另一篇文章&#xff1a;http://t.csdnimg.cn/PQu25 1.运行效果图 1.1 关注事件 1.2 笑话大全 1.3 谜语大全 1.3 多级菜单 1.4 按钮…

MySQL基础知识——MySQL索引

深入浅出索引 索引的意义 索引的意义&#xff1a;在大量数据中&#xff0c;加速访问少量特定数据&#xff1b; 使用索引的前提条件&#xff1a; 1&#xff09;索引块数量小于数据块数量&#xff1b; 2&#xff09;索引键有序&#xff0c;故可以使用二分查找等高效的查找方式&…

互联网安全面临的全新挑战

前言 当前移动互联网安全形势严峻&#xff0c;移动智能终端漏洞居高不下、修复缓慢&#xff0c;移动互联网恶意程序持续增长&#xff0c;同时影响个人和企业安全。与此同时&#xff0c;根据政策形势移动互联网安全监管重心从事前向事中事后转移&#xff0c;需加强网络安全态势感…

ETF期权是什么详解

ETF期权是什么 ETF期权的本质是一种金融衍生品&#xff0c;与交易所交易基金&#xff08;Exchange-Traded Fund&#xff0c;简称ETF&#xff09;相关的期权合约。其核心在于赋予了投资者在未来某个时间点以约定价格买入或卖出特定ETF&#xff08;交易所交易基金&#xff09;的…
最新文章