算法设计与分析 SCAU11091 最优自然数分解问题(优先做)

news2024/9/22 7:28:09

11091 最优自然数分解问题(优先做)

时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题 语言: G++;GCC;VC;JAVA
在这里插入图片描述


Description

问题描述:设n是一个正整数。
(1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大。
(2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大。
编程任务:对于给定的正整数n,编程计算问题(1)和(2)的最优分解的最大乘积。

注意:

  1. 这里的自然数不含0但允许为1。
  2. 特别地,当整数n无法分解为若干互不相同的加数时,即自身视为单独的一个加数,
    比如输入2,问题(1)的解输出为2。而如果整数n可以分解为若干互不相同的加数时,
    不考虑自身为单独加数的情况,比如4,问题(1)的解输出为3,而非4。
  3. 若干互不相同自然数或若干自然数,这个若干可>=1,也就是可以为1。


输入格式

只有一个正整数n(1<=n<=100)。

输出格式

输出待解问题(1)和(2)的最大乘积,中间空格相连,这两个数可能较大请皆用64位整数。

如,输入n为10,若加数互不相同,则n=2+3+5,此时最大乘积为235=30。
若加数可相同,则n=2+2+3+3,此时最大乘积为223*3=36。


输入样例

10


输出样例

30 36


解题思路

贪心算法

(1)分解为互不相同自然数之和

注意到: 若a+b等于一个常数,则|a-b|越小,ab就越大。
要使得加数互不相同,又尽可能集中,那加数只能是连续的自然数了。

贪心策略:当n等于1至4时单独处理。n大于4时,将n分成从2开始的连续的自然数的和。如果最后剩下一个数,将此剩余数在后项优先的方式下均匀地分给前面各项

(2)分解为若干自然数之和

注意到: 若a+b等于一个常数,则|a-b|越小,ab就越大。
若 n = m1+m2+…+mk,则 -1 <= (mi-mj) <= 1,(1<=i<=k, 1<=j<=k),
即任意加数的差距不超过正负1。
由于拆分的加数可以相同,任何一个数拆后乘积总比不拆强,因此拆到极尽,
极尽的加数为3或2,且拆为3比拆为2好,因此优先拆为3。

贪心策略:
极尽拆解,尽可能先将n拆成3,3,3,…,3;若拆成若干3后还有剩余,则为2,或2和2。

归纳公式如下:

  1. max{m1m2…*mk} = 3 ^ (n/3) if n(mod 3)等于0
  2. max{m1m2…*mk} = 4 * 3 ^ [(n-4)/3] if n(mod 3)等于1
  3. max{m1m2…*mk} = 2 * 3 ^ [(n-2)/3] if n(mod 3)等于2

算法思路

分解为互不相同自然数之和
  1. 列出 n 为 1~4 的特殊处理
  2. 将 n 拆成从2开始的连续自然数的和,拆不了就退出循环。比如 10 拆成 2,3,4,由于无法继续拆成5,所以退出循环,此时剩余数为1。
  3. 将剩余数从后往前分配
  4. 将数组中的数依次相乘
ll one(int n) {
    if(n == 1)
        return 1;
    else if(n == 2)
        return 2;
    else if(n == 3)
        return 2;
    else if(n == 4)
        return 3;

    vector<int> a;
    int i = 2, sum = 0;
    // 将 n 拆成从2开始的连续自然数的和
    // 比如 10 拆成 2,3,4,由于无法继续拆成5,所以退出循环,此时剩余数为1
    while(sum + i <= n) {
        sum += i;
        a.push_back(i);
        i++;
    }

    i = a.size() - 1; // 分配的话,从最后一个自然数开始分配
    int leave = n - sum; // leave 为最后剩下的数,准备分配给前面的连续自然数

    while(leave) {
        a[i]++;
        i--; // 索引减1,准备分配给前一个自然数
        leave--;
    }

    ll res = 1;
    for(i = 0; i < a.size(); i++) {
        res *= a[i];
    }

    return res;
}
分解为相同自然数之和

递归,类似于剪绳子的解题思路:剑指 Offer 14- I. 剪绳子 动态规划 /贪心算法(以及贪心算法的一些奇特优化思路)

  1. 长度为4时,剪为两个2是最好
  2. 长度为3时,不剪时是最好
  3. 长度为2时,不剪时是最好
  4. 其他更长长度的情况,将每次划分出3,然后继续递归即可
ll two(int n) {
    if(n == 4)
        return 2 * 2;
    else if(n == 3)
        return 3;
    else if(n == 2)
        return 2;
    else
        return 3 * two(n - 3);
}



更多注释可查看下方的完整代码中,有助于理解。

代码如下

#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

ll one(int n) {
    if(n == 1)
        return 1;
    else if(n == 2)
        return 2;
    else if(n == 3)
        return 2;
    else if(n == 4)
        return 3;

    vector<int> a;
    int i = 2, sum = 0;
    // 将 n 拆成从2开始的连续自然数的和
    // 比如 10 拆成 2,3,4,由于无法继续拆成5,所以退出循环,此时剩余数为1
    while(sum + i <= n) {
        sum += i;
        a.push_back(i);
        i++;
    }

    i = a.size() - 1; // 分配的话,从最后一个自然数开始分配
    int leave = n - sum; // leave 为最后剩下的数,准备分配给前面的连续自然数

    while(leave) {
        a[i]++;
        i--; // 索引减1,准备分配给前一个自然数
        leave--;
    }

    ll res = 1;
    for(i = 0; i < a.size(); i++) {
        res *= a[i];
    }

    return res;
}

ll two(int n) {
    if(n == 4)
        return 2 * 2;
    else if(n == 3)
        return 3;
    else if(n == 2)
        return 2;
    else
        return 3 * two(n - 3);
}

int main()
{
    int n;
    cin >> n;

    cout << one(n) << " " << two(n);

    return 0;
}


最后

对我感兴趣的小伙伴可查看以下链接

  • 我的掘金主页:https://juejin.cn/user/1302297507801358
  • 博客主页:http://blog.zhangjiancong.top/
  • 公众号:Smooth前端成长记录

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

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

相关文章

【毕业设计】电影评论情感分析 - GRU 深度学习

文章目录0 前言1 项目介绍2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学…

手机拍照模糊怎么办?拍摄低像素照片如何修复清晰?

相信有很多人在用手机拍摄照片时自认为应该非常精美&#xff0c;拍完后却发现它模糊不清&#xff01;最终遗憾地错过了精彩的瞬间&#xff0c;令人非常遗憾&#xff01;虽然手机不是专业的摄像机&#xff0c;拍摄时模糊在所难免。但是我们可以在前期尽量避免拍摄的照片模糊&…

感冒了吃抗生素有用吗?

点击蓝字 &#xff5c;关注我们 2023年《科学世界》杂志全年订阅现已开启。 现在订阅&#xff0c;立享7.5折&#xff0c;并赠送经典科普图书《从一到无穷大》。通过文末链接&#xff0c;即可登录“科学世界”微店订购。抗生素&#xff0c;简单地说就是杀死细菌的药物。更准确地…

从源码上看,RocketMQ 5.0 跟 RocketMQ 4.x相比增加了哪几个模块

今天来介绍一下 RocketMQ 5.0 源码上的变化。 RocketMQ 5.0 是一个里程碑式的版本&#xff0c;经历了近 5 年的打磨&#xff0c;代码变更达到 60%。 首先看一下源码中模块的变化&#xff0c;如下图&#xff1a; 从图中可以看到&#xff0c;RocketMQ 5.0 主要增加了 4 个模块儿…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园生活互助平台06qe4

对于即将毕业或者即将做课设的同学而言&#xff0c;由于经验的欠缺&#xff0c;面临的第一个难题就是选题&#xff0c;确定好题目之后便是开题报告&#xff0c;如果选题首先看自己学习那些技术&#xff0c;不同技术适合做不同的产品&#xff0c;比如自己会些简单的Java语言&…

DataScience:KNIME工具的简介、安装、使用方法之详细攻略

DataScience&#xff1a;KNIME工具的简介、安装、使用方法之详细攻略 目录 KNIME的简介—数据挖掘与分析工具 1、KNIME软件如何帮助您的数据分析? 1.1、Create 1.2、Productionize 2、KNIME Analytics Platform 3、KNIME Hub KNIME的安装 KNIME的使用方法 1、构建第一…

[附源码]java毕业设计领导干部听课评课管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【深入浅出Spring6】第四期——实例化Bean和Bean的生命周期

一、获取 Bean Spring 提供了多种实例化Bean的方式&#xff1a;【只是表现形式不同&#xff0c;底层都是通过构造方法创建对象的】 通过构造方法实例化 【最简单的方式直接声明bean】通过简单工厂模式实例化 【定义一个简单模式工厂&#xff0c;然后通过工厂的静态方法获得Bea…

P3205 [HNOI2010]合唱队

[HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果&#xff0c;作为 AAA 合唱队负责人的小 A 需要将合唱队的人根据他们的身高排出一个队形。假定合唱队一共 nnn 个人&#xff0c;第 iii 个人的身高为 hih_ihi​ 米&#xff08;1000≤hi≤20001000 \le h_i …

Java网络编程套接字

文章目录1、网络编程基础2、Socket套接字2.1 Java数据报套接字通信模型2.2 Java流式套接字通信模型2.3 Socket编程注意事项3、UDP数据报套接字编程4、TCP流式套接字编程1、网络编程基础 在没有网路之前&#xff0c;两个进程只能在同一主机上进行通信&#xff0c;但是无法跨距离…

【kubernetes篇】使用Nfs实现kubernetes持久化存储

引言 在kubernetes使用的过程中&#xff0c;有很多数据需要持久化保存。而kubernetes本身不能实现这样的功能&#xff0c;所以需要提供外部存储来实现。nfs网络文件系统&#xff0c;能良好支持pv动态创建等功能&#xff0c;是一个不错的持久化保存方式。今天将这一部分内容作以…

jsx代码如何变成dom

jsx代码如何变成dom一、三个问题考察对jsx的理解二、jsx的本质以及它和js之间是什么关系&#xff1f;2.1 jsx是什么2.2 和js的关系2.3 jsx的本质三、为什么要用jsx&#xff1f;不用会有什么后果四、jsx背后的功能模块是什么&#xff1f;这个功能模块都做了哪些事情&#xff1f;…

DVWA 之 SQL注入(非盲注)

文章目录SQL注入1.判断是否存在注入&#xff0c;注入是字符型还是数字型2.猜解SQL查询语句中的字段数3.确定显示的字段顺序4.获取当前数据库5.获取数据库中的表6.获取表中的字段名7.下载数据SQL注入 步骤&#xff1a; 1.判断是否存在注入&#xff0c;注入是字符型还是数字型 2…

数据库平滑扩容方案剖析

1. 扩容方案剖析 1.1 扩容问题 在项目初期&#xff0c;我们部署了三个数据库A、B、C&#xff0c;此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配&#xff0c;我们在Service服务层使用uid%3进行取模分片&#xff0c;从而将数据平均分配到三个数据库中。 如…

4-6 最小生成树Prim,Kruskal(贪心)

4.6最小生成树 Prim,Kruskal(贪心) 一、问题描述 设G (V,E)是无向连通带权图&#xff0c;即一个网络。E中每条边(u,v)的权为 c[u][v]。 如果G的子图G’是一棵包含G的所有顶点的树&#xff0c;则称G’为G的生成树。生成树上各边权的总和称为该生成树的耗费。 在G的所有生成树中…

java计算机毕业设计基于安卓Android的校园快药APP-药店管理app

项目介绍 本文介绍了校园快药APP软件开发建设的意义和国内外发展现状,然后详细描述了所开发手机APP的可行性分析,并分析了手机APP所要实现的功能。因为校园快药设施较多,而且人口密集,不能更好的管理校园快药,造成需要时患者不必要的伤亡,所以采用比较方便的、容易便携的手机AP…

[附源码]Python计算机毕业设计Excel操作题自动评分系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

基于PHP+MySQL的企业宣传展示网

随着互联网的发展,企业越来越重视网上宣传渠道了。谢现在各大企业都有了自己的官网,以达到宣传企业或方便客户了解企业的目的。PHP企业宣传展示网分为前台和后台两部分。前台不部分主要是让用户了解和查看及动态等信息,使用的后台部分主要是企业的管理人员对网站的信息进行管理…

股票系统接口是如何进行数据共享的?

股票系统接口系统在量化交易中常见的一种数据挖掘系统&#xff0c;就比如说&#xff0c;如果你想要从别的网站或服务器上获取资源或信息&#xff0c;别人是不会把数据库共享过来的&#xff0c;他只能给你提供一个他们写好的编程方法来获取数据。也就是说通过股票系统接口输入你…

springboot15:junit5的使用

1.测试平台Junit springboot新版使用junit 只需要标注一个注解SpringBootTest然后方法中标注Test即可 以前springboot的使用 比较困难 现在整合使用后 只需要编写测试方法Test写测试的逻辑&#xff0c;整个类具有spring的功能&#xff0c;比如事务&#xff08;测试完成后会自动…