【剑指offer14-II】【C++】剪绳子【贪心+整数快速幂】_剑指 offer 14- ii. 剪绳子 ii c++ 动态规划-程序员宅基地

技术标签: C++  贪心算法  leetcode  LeetCode  

【剑指offer14-II】【C++】剪绳子【贪心+整数快速幂】

题目

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

提示:

2 <= n <= 1000

题解

笔记:
贪心的思路。
力扣精选题解

1.需要注意本题涉及到大数,动态规划不可取,怎么都过不了
2.利用贪心算法,经过数论证明一个数若经过分割后乘积最大,必须尽可能多的分成3,其次是2,具体证明详见上面力扣题解的超链接。
3.用到整数快速幂,模板
4.当余数=12时,还需要注意返回的值乘上4或者2之后,还需要取余,不然也会超出范围。

代码:

class Solution {
    
public:
    long quickPow(int n,int a,int mod){
    
        long ans = 1;
        long res = n;
        while(a>0){
    
            if( a & 1 == 1){
    
                ans = (ans*res)%mod;
            }
            res = (res*res)%mod;
            a >>= 1;
        }
        return ans%mod;
    }
    int cuttingRope(int n) {
    
        if(n==2)
            return 1;
        if(n==3)
            return 2;
        if(n>=4)
        {
    
            //求n = a*x+b
            int b = n%3;//余数
            int a = n/3;//商
            if(b==0) //余数为0,即n = 3a,最大乘积=3^a
                return quickPow(3,a,1000000007);
            else if(b==1) //余数为1,需要分解一个3,变成3+1=2*2,即n = 3(a-1)+4,最大乘积=3^(a-1)*4
                return (4*quickPow(3,a-1,1000000007))%1000000007;
            else if(b==2)//余数为2,即n = 3a + 2,最大乘积=3^a*2
                return (2*quickPow(3,a,1000000007))%1000000007;
        }
        return 0;
    }
};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41997479/article/details/107568568

智能推荐

No.5-VulnHub-W1R3S: 1-Walkthrough渗透学习_vulnhub的w1rs3-程序员宅基地

文章浏览阅读1.1k次。**VulnHub-W1R3S: 1-Walkthrough**靶机地址:https://www.vulnhub.com/entry/w1r3s-101,220/靶机难度:中级(CTF)靶机发布日期:2018年2月5日靶机描述:You have been hired to do a penetration test on the W1R3S.inc individual server ..._vulnhub的w1rs3

python因子分析_python中的因子分析简介-程序员宅基地

文章浏览阅读7k次,点赞5次,收藏48次。python因子分析Factor Analysis (FA) is an exploratory data analysis method used to search influential underlying factors or latent variables from a set of observed variables. It helps in data interpretatio..._python 因素分析

python自动写作ai_python自动写作ai_ai自动写作python python编程100例-程序员宅基地

文章浏览阅读927次。人工智能和python是什么关系?人工智能是一个大概念。人工智能项目的具体实施将联系机器学习和深度学习框架。这些框架大多是基于python开发的。因此,为了深入开发人工智能项目,学习python语言也是必要的代码一定要人去写吗,能不能用Python弄个人工智能来写C ?请为我写一个软件。电脑:我能写一百万种软件。你想要哪一个?人:我想写一个聊天工具。电脑:我已经找回了现成的软件微信,可以吗?人民:..._实现python机器学习自动去写小说

java 二进制结构体_Java位运算符及二进制常识-程序员宅基地

文章浏览阅读317次。一、位运算 二、位移运算 三、二进制数以Java中最常使用的int类型为例(32位)。 ㈠ 符号位二进制数最左端的数字为符号位:0代表正,1代表负。㈡ 最大与最小⑴ 1是最小的正整数,符号位为0,最后一位为1,其它全部为0。递增:二进制数右端每次加1(逢2进1),一直到31个非符号位的0全部变为1,得到最大的正整数2147483647。⑵ -1是最大的负整数,符号位为1,其它31位也全部为1。递..._jna 二进制转结构体

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图-程序员宅基地

文章浏览阅读73次。最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注! 一 申请API key 在使..._百度地图 安卓代码设置key

CodeReview Learning-程序员宅基地

文章浏览阅读153次。目录0. 引言1. 代码检视的指导思想2. 代码检视的内容3. 回归测试0. 引言代码检视(Code Review)是指软件开发人员在完成代码设计、编写、调试后展开的个人或群体性的代码阅读过程,代码检视的目的是发现代码中的设计问题、格式问题、逻辑问题、语法问题等,从而保证代码的高质量交付。从软件工程的角度讲,在代码检视阶段发现代码问题的成本是低廉的,所以严..._缺陷密度与代码评审行数的关系

随便推点

出租车Jt/T 905协议与部标1078协议融合的网约车视频监控平台-程序员宅基地

文章浏览阅读1.3k次。出租车jt/t 905协议,是jt/t 808协议的一个变种,设计者将部标808协议拿过来,并不是单纯的增加网约车相关的指令集,而且对原有的指令如定位0×0200指令也进行了修改,经过一通剧烈的修改,面目全非,协议已经与808协议本身并不兼容,这是比较失败的地方,保持兼容性,才能使协议更加让硬件和网约车平台接受和开发推广,没有经验的协议设计者和标准制定者高高在上不考虑兼容性,给硬件厂家和平台开发人..._jt808 与 jt905

提示“Resource temporarily unavailable”的原因及解决办法-程序员宅基地

文章浏览阅读3.4k次。问题:Linux环境下编程时,在读串口时,出现“Resource temporarily unavailable”的错误提示。 原因:串口设置成了非阻塞模式,但是没有用select去判断是否有数据到来就去读。 解决方法: 要么将串口设置成阻塞模式,要么使用select。转载于:https://www.cnblogs.com/nufangrensheng/p/3813298.html..._rmmod: can't unload module 'imx6uirq': resource temporarily unavailable

java构造扑克牌算法_java扑克牌算法-程序员宅基地

文章浏览阅读1.3k次。java扑克牌算法java扑克牌算法1、实验内容或题目(1) 请定义一个名为Card的扑克牌类,该类有两个private访问权限的字符串变量face和suit:face描述一张牌的牌面值(如:"Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen..._请定义一个名为card的扑克牌类,该类有两个private访问权限的字符串变量face和suit

(转载)android控件之WebView控件缩小-程序员宅基地

文章浏览阅读80次。android控件之WebView控件缩小作者: 字体:[增加减小] 类型:转载 时间:2013-05-16我要评论发现这个控件挺好用,能自已控制进度条,而且这个控件的功能非常壮大,先上个简单的复制代码代码如下:package com.weizhu.lan.view;import com.weizhu.lan.util...._按钮控件实现对webview页面缩放

微信ajax重复发送请求,防止重复发送ajax请求的解决方法【原创】-程序员宅基地

文章浏览阅读346次。Ajax技术不必刷新整个页面,只对页面的局部进行更新,在前端各方面应用都很多。关于防止重复发送ajax请求,一般是重复点击提交按钮导致重复提交,网上也有很多解决方法,这里写一下我自己用的一个方法。var post_flag = false; //定义一个变量为falsefunction changeInfo(url,data) {if (post_flag) {return false; //如果..._微信 重复请求

JS实现前端动态分页码-程序员宅基地

文章浏览阅读746次。思路分析:有3种情况第一种情况,当前页面curPage < 4第二种情况,当前页面curPage == 4第三种情况,当前页面curPage>4此外,还要考虑,当前页码 curPage < pageTotal(总页码)-2,才显示 ...首先,先是前端的布局样式<body> /*..._javascript 的动态 html 设置动态页码

推荐文章

热门文章

相关标签