zoukankan      html  css  js  c++  java
  • 剪绳子(贪心算法)

     1 #include <iostream>
     2 #include <cmath>
     3 
     4 using namespace std;
     5 
     6 /**
     7  * 题目分析:
     8  * 先举几个例子,可以看出规律来。
     9  * 4 : 2*2
    10  * 5 : 2*3
    11  * 6 : 3*3
    12  * 7 : 2*2*3 或者4*3
    13  * 8 : 2*3*3
    14  * 9 : 3*3*3
    15  * 10:2*2*3*3 或者4*3*3
    16  * 11:2*3*3*3
    17  * 12:3*3*3*3
    18  * 13:2*2*3*3*3 或者4*3*3*3
    19  *
    20  * 下面是分析:
    21  * 首先判断k[0]到k[m]可能有哪些数字,实际上只可能是2或者3。
    22  * 当然也可能有4,但是4=2*2,我们就简单些不考虑了。
    23  * 5<2*3,6<3*3,比6更大的数字我们就更不用考虑了,肯定要继续分。
    24  * 其次看2和3的数量,2的数量肯定小于3个,为什么呢?因为2*2*2<3*3,那么题目就简单了。
    25  * 直接用n除以3,根据得到的余数判断是一个2还是两个2还是没有2就行了。
    26  * 由于题目规定m>1,所以2只能是1*1,3只能是2*1,这两个特殊情况直接返回就行了。
    27  *
    28  * 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。
    29  */
    30 long long n_max_3(long long n) {
    31     if (n == 2) {
    32         return 1;
    33     }
    34     if (n == 3) {
    35         return 2;
    36     }
    37     long long x = n % 3;
    38     long long y = n / 3;
    39     if (x == 0) {
    40         return pow(3, y);
    41     }
    42     else if (x == 1) {
    43         return 2 * 2 * (long long)pow(3, y - 1);
    44     }
    45     else {
    46         return 2 * (long long)pow(3, y);
    47     }
    48 }
    49 
    50 //给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
    51 //
    52 //输入描述:
    53 //输入一个数n,意义见题面。(2 <= n <= 100)
    54 //
    55 //
    56 //输出描述:
    57 //输出答案。
    58 //示例1
    59 //输入
    60 //8
    61 //输出
    62 //18
    63 int main() {
    64     long long n = 0;
    65     cin >> n;
    66     cout << n_max_3(n) << endl;
    67     return 0;
    68 }
  • 相关阅读:
    4.1.4协变和逆变 不常用
    4.1.33匿名方法Lambda语法
    4.1.1委托和广播
    1.4.3用户定义异常类
    1.4.2异常处理
    1.3.6接口判断及显式实现比较
    常用正则表达式
    git
    Pod 操作
    C语言指针的初始化和赋值
  • 原文地址:https://www.cnblogs.com/zhiliang9408/p/11520604.html
Copyright © 2011-2022 走看看