[贪心+数学/数学+位运算] 两种方法O(1)解决 消减整数

news2024/12/29 17:17:54

 标题:[贪心+数学/数学+位运算] 两种方法O(1)解决 消减整数 

个人主页@水墨不写bug

目录

 一、题目:消减整数(Newcoder)

 二、题目分析

1.理解题意:

 2.解决问题

解法详解一:贪心+数学

解法一参考代码:

解法详解二:数学+位运算

解法二参考代码:


 正文开始:

前言:

        本文是我在刷题的时候偶然遇到的算法题,对此题我有自己想出来的做法,可以达到O(1)时间复杂度,与常用的解法相比 方法比较巧妙,于是分享出来供参考学习,如果有错误,也欢迎不吝赐教。

 一、题目:消减整数(Newcoder)

题号:NC219038
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld


题目描述

        给出一个正整数H,从1开始减,第一次必须减1,每次减的数字都必须和上一次相同或者是上一次的两倍,请问最少需要几次能把H恰好减到0。


输入描述:

        第一行给出一个正整数T,  T >= 1 并且 T <= 10^4

        接下来T行每行一个整数H,  满足  1≤H≤10^9


输出描述:

每行一个正整数代表最少的次数

示例1

输入

3(T)
接下来T行输入测试用例
3
5
7

输出

2
3
3

 二、题目分析

1.理解题意:

        为了方便,我们只举一个例子:3

        3第一次-1;得到2

        第二次有两种选择:继续-1 或者 (减1的二倍)-2

        如果选择-2,得到0,则最短路径就是2。

 

 2.解决问题

        在正式讲解可行的算法之前,先考虑暴力解法(因为可行解法往往是暴力解法的优化):

        对于一个数,每次要么-A,要么-2*A;(A是下一次需要减的数)

                于是暴力解法就是对每一次减,都逝一逝(A和2*A)。这里我就不试了,为什么想必大家都知道。 

        复杂度:O(2^N)

解法详解一:贪心+数学

         贪心:每次都减2*A,这样能减的更快,用的次数更少;但是不能保证正确性,比如下面的这个特例:

        这就由于贪心而错失了正确答案。 正确的处理方法是在每次贪心之前,需要进行一步判断。

        我们暂且称上述的贪心为短视的“简单贪心”。假设一个数,经过“简单贪心”刚好可以减到0:

这就意味着这个数一定 是2a的整数倍!!

        那么就只需要在每次减之前,让这个数 % (2*A),如果等于0,这就意味着我们目前可以得正确的结果。意味着我们走在正确的二叉树分支上。意味着我们是在得到正确答案的基础上贪心!


解法一参考代码:

#include <iostream>
using namespace std;

int t, h;

int fun()
{
    int ret = 0, a = 1;

    while(h)
    {
        h -= a;
        ret++;
        if(h % (a * 2) == 0)
        {
            a *= 2;
        }
    }
    return ret;
}

int main()
{
    cin >> t;
    while(t--)
    {
        cin >> h;
        cout << fun() << endl;
    }
    return 0;
}

解法详解二:数学+位运算

         这个解法是我自己想到的解法。起初我想到位运算,因为每次减的数都是2的N次方,

(1,2,4,8,16....),于是我写出了下面的代码,并暗自得意这道题,也就不过如此嘛:

int cut_int(int n)
{
	int ans = 0;
	
	for(int i = 0;i < 32;++i)
	{
		if(((n >> i) & 1) == 1)
		{
			ans++;
		}
	}
	return ans;
}
int main()
{
	int n;
	cin>>n;
	int tem;
	while(n--)
	{
		cin>>tem;
		cout<<cut_int(tem)<<endl;
	}
	return 0;
}

        但是提交后,我立刻发现了问题所在:2的倍数是一个次数一个次数加上去的,在合理的范围内,每一个2的次方数都至少要出现一次! 

        仅仅统计二进制1位的出现次数得出的是错误的答案!因为减的数字是从1开始的。不可能直接越过4而减去8/16/32.....

        于是, 我们可以先预先算出2出现的最高次数N,再一次减去(2的次方项 1,2,4,8,16....),这样不就保证不会出现上述的越级的行为!!

        对于2的次方项,我们可以通过等比数列前n项求和公式计算:

        然后让目标数字num-(Sn),得到的剩下的数,不就直接可以通过统计二进制位的方式来计算减的次数了嘛!!

总结记目标数A,2出现的最高次项N

        由于减去的数字从1开始,以次乘二,所以减去的数中一定是依次增大的(1,2,4,8.)2的次方项一定会每个都至少出现一次!

        我们通过一次操作:让目标数-(2的次方项1,2,4...直到最高次项N,这个过程等比数列求和计算),同时操作次数+N;从此我们就得到了新的目标数B,B就可以通过计算二进制位上1的个数来得到最终的答案。 


解法二参考代码:

#include <iostream>
#include<cmath>
using namespace std;

int cut_int(int n)
{
	int ans = 0;
	
	int fn = 0;
	for(int i = 1; pow(2,i) - 1 <= n;++i)
	{
		fn = i;
	}
	
	ans += fn;
	
	n -= (pow(2,fn)-1);
	
	for(int i = 0;i < 32;++i)
	{
		if(((n >> i) & 1) == 1)
		{
			ans++;
		}
	}
	return ans;
}
int main()
{
	int n;
	cin>>n;
	int tem;
	while(n--)
	{
		cin>>tem;
		cout<<cut_int(tem)<<endl;
	}
	
	return 0;
}

完~

未经作者同意禁止转载

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

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

相关文章

【RabbitMQ——具体使用场景】

1. 异步 1.1 同步异步的问题&#xff08;串行&#xff09; 串行方式&#xff1a;将订单信息写入数据库成功后&#xff0c;发送注册邮件&#xff0c;再发送注册短信。以上三个任务全部完成后&#xff0c;返回给客户端 public void makeOrder(){// 1 :保存订单 orderService.…

电脑退域或切换系统账号后系统黑屏

之前加入域时迁移了账号系统&#xff0c;导致退域后本地账号系统没了东西黑屏但能看到鼠标。也登不了域账号了一顿慌张&#xff08;操作如下&#xff09; 解决&#xff1a;又加回了域哈哈哈 重启电脑按F8进不去安全模式&#xff0c;找不到触发时间... winr打开运行&#xff0c;…

什么是托管安全信息和事件管理 SIEM?

什么是 SIEM&#xff1f; 安全信息和事件管理 ( SIEM ) 解决方案最初是一种集中式日志聚合解决方案。SIEM 解决方案会从整个组织网络中的系统收集日志数据&#xff0c;使组织能够从单一集中位置监控其网络。 随着时间的推移&#xff0c;SIEM解决方案已发展成为一个完整的威胁…

Jenkins简介;Jenkins安装

一&#xff0c;Jenkins简介 1、什么是Jenkins Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2、Jenkins的作用 持续的软…

【Golang】(推荐项目)Go后端工程项目

Go后端工程项目 在这个基于项目的课程中&#xff0c;我们将从头开始用 Go 构建一个完整的 REST API。 本次项目将从构建一个简单的 TCP 服务器开始&#xff0c;目标是探索 Go 中的 net/http 包。本项目的目标是获得构建和推理一般后端系统的基础知识。 为什么推荐这个项目&am…

操作台厂家如何设计工作台面才能让企业高效办公?

在快节奏的现代商业环境中&#xff0c;高效办公已成为企业竞争力的重要体现。嘉德立作为一家专注设计操作台厂家&#xff0c;很明确的告诉大家设计一款既能提升工作效率&#xff0c;又能兼顾员工舒适度的工作台面&#xff0c;是赢得市场的关键。那么&#xff0c;如何巧妙地设计…

【LLM】 TinyAgent 构建指南

文章目录 TinyAgent 构建指南项目概述实现步骤步骤一&#xff1a;模型构建步骤二&#xff1a;工具构建步骤三&#xff1a;Agent 构建步骤四&#xff1a;运行 Agent 结论参考文献学习心得 TinyAgent 构建指南 项目地址&#xff1a;https://github.com/datawhalechina/tiny-univ…

详解位示图计算方法、代码

位示图 位示图的核心思想计算过程与位操作假设问题场景&#xff1a; 实际操作与计算&#xff1a;1. 位示图的初始化2. 设置某一位&#xff08;标记资源占用&#xff09;3. 清除某一位&#xff08;释放资源&#xff09;4. 查询某一位&#xff08;检查资源状态&#xff09; 示例问…

【2米/8米光学卫星】

2米/8米光学卫星 2米/8米光学卫星&#xff0c;通常指的是GF-1 B、C、D卫星&#xff0c;这是我国民用空间基础设施发展规划中的首个民用高分辨率光学陆地业务星座&#xff0c;也是自然资源部组建后发射的首批业务卫星。以下是对该卫星的详细介绍&#xff1a; 一、基本信息 发…

k8s 分布式存储平台 -- Longhorn

文章目录 一、什么是 Longhorn二、架构设计1、工作原理2、工作流程3、基于微服务设计的优势 三、安装1、安装要求2、使用 Longhorn 命令行工具&#xff08;验证方式一&#xff09;3、使用环境检查脚本&#xff08;验证方式之二&#xff09;3.1、安装 jq3.2、运行脚本 4、安装 o…

AI会议时代:企业如何搭上快车?

“我 们认为&#xff0c;AI绝不仅是会议的辅助工具&#xff0c;而更会是重塑会议流程的关键力量。通过AI的个性化定制、大规模支持、智能分析这些技术&#xff0c;AI会议将大大提升会议的智能化与高效性&#xff0c;进而成为企业数字化转型的核心驱动力。” 作者|斗斗 编辑…

QTreeview model过滤

QTreeview model数据过滤&#xff1a;大小写区分&#xff0c;对列过滤&#xff0c;对子对象过滤 示例&#xff1a; 需要自定义QSortFilterProxyModel, //自定义过滤model mProxyModel new TreeFilterProxyModel(this); //添加treeview当前model mProxyModel->setSource…

【源码+文档+调试讲解】学生选课系统Python

摘 要 学生选课系统采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写&#xff0c;使用了Django框架。该系统从三个对象&#xff1a;由管理员和学生、教师来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对学生、教…

Brave编译指南2024 MacOS篇-获取源码(三)

引言 在上一篇文章中,我们介绍了Brave浏览器的基本特性,以及编译Brave所需的系统要求和推荐工具。现在,我们将进入编译过程的第一个实际步骤:获取Brave的源代码。这一步骤对于后续的编译和开发工作至关重要。 1. Brave源码的获取途径 Brave的源码托管在GitHub上,任何人都可以…

YOLO格式数据集转为COCO数据集(简单粗暴)

最近需要用的coco格式的数据集&#xff0c;但是在网上找的很多 毕竟麻烦&#xff0c;简单记录一下&#xff01; 1、调整目录结构&#xff08;以GC10-DET数据集为例&#xff09; YOLO格式数据集目录结构如下&#xff1a; 简单来说就是images文件夹里面有train、val、test三个文…

OJ在线评测系统 在Linux虚拟机搭建Docker 概念 入门 安装

Docker的基本概念 为什么要用docker容器技术 为了提升系统的安全性 把不同的程序和宿主机进行隔离 使得某个程序 应用的执行不会影响到系统本身 docker技术可以实现程序和宿主机的隔离 容器可以理解成对一系列应用程序、服务和环境的封装 从而把程序运行在一个隔离的 封闭…

在阿里云PAI的DSW上面部署InternLM-XComposer2-VL-1.8B和InternVL2-2B

1.准备开发环境 1.1 阿里交互式建模(DWS) 首先,去阿里云账号注册界面注册好自己的账号然后,开通人工智能平台PAI 如果已经开通,可以进入管理控制台点击,“新建实例”实例名称,根据自己的意愿填写资源配额选择"公共资源组(按量付费)"资源规格"ecs.gn7i-c8g1.2x…

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出 文章目录 一、清单二、实验结果三、核心代码四、代码获取五、总结 一、清单 基于灰狼优化BP神经网络的数据预测Matlab程序GWO–BP 基于灰狼优化卷积神经网络的数据预测Matlab程序G…

c++day08

思维导图 栈 #include <iostream>using namespace std;template <typename T> class Stack { private:static const size_t MAX 100; // 定义固定容量T data[MAX]; // 存储栈元素的数组size_t len; // 当前栈的大小public:…

华为玄玑感知系统震撼发布:智能穿戴新品引领情绪健康新纪元

在科技日新月异的今天&#xff0c;华为再次以其卓越的创新能力&#xff0c;为智能穿戴领域带来了一场革命性的变革。 8月28日&#xff0c;华为玄玑感知系统暨穿戴创新技术发布会圆满落幕&#xff0c;会上正式揭晓了这款名为“玄玑”的神秘感知系统&#xff0c;预示着穿戴设备将…