每日练习之数学——砝码和天平

简介: 每日练习之数学——砝码和天平

砝码和天平

题目描述

运行代码

#include<iostream>
using namespace std;
int main()
{
  int w,m,T;
   cin>>T;
    while(T--)
    {
       cin>>w>>m;
        while(m)
        {
            if((m-1)%w==0)m=(m-1)/w;
            else if((m+1)%w==0)m=(m+1)/w;
            else if(m%w==0)m/=w;
            else break;
        }
        if(!m)
            cout<<"YES"<<endl;
        else 
            cout<<"NO"<<endl;
    }
}

代码思路

通过模拟天平的称量过程来检查是否能够使用给定的砝码(其质量为w的幂次)来表示一个特定的质量m。不是直接根据题目的数学思路来解决问题的,它实际上是在尝试模拟一个通过增加或减少少量质量来尝试使质量m能被w整除的过程。

  1. 首先读取测试数据的组数T。
  2. 对于每一组数据,读取w和m的值。
  3. 使用一个while循环尝试将m“调整”到一个可以被w整除的值。这里尝试了三种操作:
  • 如果m-1可以被w整除,则将m设置为(m-1)/w
  • 如果m+1可以被w整除,则将m设置为(m+1)/w
  • 如果m本身可以被w整除,则将m除以w。
  1. 如果在循环结束后m变为0,那么输出"YES",表示可以通过这些砝码来表示质量m(尽管这不是直接通过砝码组合,而是通过上述的“调整”过程)。
  2. 如果循环结束后m不为0,那么输出"NO",表示无法通过这些砝码来表示质量m。

改进思路

问题
  • 它没有直接利用到砝码是w的幂次这一特性。实际上,我们可以直接使用二进制表示法来判断m是否可以通过这些砝码来表示,而不需要这种“调整”过程。
  • 它假设了通过增加或减少1个单位的质量可以使得m变得可以被w整除,这在实际情况下并不总是正确的。
  • 即便m在某个点变得可以被w整除,这并不意味着它可以通过砝码组合来表示。因为代码没有检查这个整除后的m是否仍然在1到w的n次方减1的范围内。
改进

判断质量m是否可以用w的幂次砝码来表示,即判断m是否小于w(n+1)次方(其中n是砝码的最大幂次,但在这个问题中我们不需要确切知道n,只需要知道w(n+1)次方大于m即可)。

由于w可能非常大,直接计算w(n+1)次方可能会导致整数溢出。但幸运的是,我们只需要检查m是否小于w的平方,因为任何大于wm都可以通过w的更高次幂来表示(假设有足够的砝码)。

要判断一个质量m是否能用w的幂次砝码来表示,我们需要确保m可以表示为w的幂次的和,这相当于检查m的二进制表示是否只包含1(即mw的幂次的组合)。但是,由于我们不知道具体的n(砝码的最大幂次),我们可以简单地检查m是否小于或等于w的某个足够大的幂次,比如w的32次方(因为int类型通常有32位)。

然而,更简单的方法是检查m是否小于w(n+1)次方,其中n是使得w^(n+1)大于m的最小整数。由于w非常大,我们不能直接计算w^(n+1),但我们可以知道,如果m小于w的平方,那么它肯定可以用w的幂次来表示(因为w^0w^n的砝码可以覆盖从1到w^(n+1) - 1的所有整数)。

这个题目目前还没想到切实可行通过全部示例数据的数学方法解答的代码

目录
相关文章
|
7月前
1177: 迷失方阵
1177: 迷失方阵
|
7月前
数字游戏2(数位dp)
数字游戏2(数位dp)
40 0
|
6月前
|
人工智能 程序员 定位技术
老程序员分享:NOIP2016天天爱跑步(树上差分)
老程序员分享:NOIP2016天天爱跑步(树上差分)
31 0
|
6月前
|
搜索推荐 算法 C++
蓝桥杯分糖果、最小化战斗力差距、小蓝零花钱
这是一个关于算法问题的集合,包括三个不同的任务: 1. **分糖果**:肖恩有不同种类的糖果要分给学生,目标是使得到糖果字符串的字典序最大且尽量小。给定糖果种类数和一个初始字符串,输出能达到的最小字典序的最大值。 2. **最小化战斗力差距**:小蓝需要将队员分为两组,每组战斗力差距最小。给定队员数量和战斗力值,找出最小的战斗力差距。 3. **小蓝的零花钱**:小蓝要在序列中分割偶数和奇数,每次分割代价是两端元素差的绝对值。目标是在预算内确定最多能进行多少次这样的分割。 每个问题都提供了输入输出示例和相应的C++代码片段来解决这些问题。
|
6月前
【洛谷 P1781】宇宙总统 题解(高精度+结构体排序)
在宇宙总统竞选中,需计算得到最高票者。程序接收$n$($1\leq n\leq 20$)个候选人及其票数,使用自定义比较器`cmp`对结构体数组`vote`按票数长度排序。样例输入5人,票数分别为98765、12365、87954、1022356、985678,输出显示编号为4的候选人(票数1022356)获胜。代码中,结构体`S`包含候选人ID和票数字符串,通过`sort`函数及`cmp`函数按票数长度降序排列,输出首位即为胜者。
37 0
|
6月前
1037 在霍格沃茨找零钱
1037 在霍格沃茨找零钱
|
人工智能 算法
算法提高:组合数学| 容斥原理常见应用
容斥原理常见的问题如下。 (1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人? (2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?
169 0
算法提高:组合数学| 容斥原理常见应用
|
机器学习/深度学习 算法
算法提高:组合数学| 卡特兰数的实现
卡特兰数列是组合数学中在各种计数问题中常出现的数列,其前几项为1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012…… 卡特兰数首先是由欧拉在计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,即在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数用Hn表示,Hn即卡特兰数。
150 0
算法提高:组合数学| 卡特兰数的实现
尼科彻斯定理
1.题目概述 2.题解 思路分析 具体实现
108 0
|
算法 C++
【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!
【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!
139 0