贪心 最大乘积 java_最大乘积|贪心算法|FOJ1698|TYVJ3024
最大乘积
【问题描述】
一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
【输入格式】
只一个正整数n,(3≤n≤10000)。
【输出格式】
第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。
【样例输入】 【样例输入】
10 2 3 5
30
【问题分析】
怎么分解乘积最大?不妨设两个数为a, b, 那么,设 a = k + z, b = k - z
那么a * b = (k + z)(k-z) = k ^ 2 - z ^ 2
显然, 当 z 越小时, 两数乘积最大。
那么对于这道题目呢?
{ a, b 为整数,a,b 不相同}
那么也就是说当b = a + 1时 他们的乘积是最大的。
对于一个数 n 来说, 也就是 把它分解成 1, 2, 3, ... , n(n+1)/2时乘积是最大的!?
但是 将他 分解出一个 1 好像并不会使乘积最大,相反的还会占用一个数的空间,所以我们选择
从 2 开始分解。
如: 9 = 2 + 3 + 4
8 = 2 + 3 + 4?
很快又发现问题了,2+3+4 > 8,那么我们就想一想 2+3 + 几 = 8
显然 这个叫几的东西 = 3。
那么这个 3 怎么办呢?
由题意每一个被分解出来的数都不相等, 那我们只能把这个 3 前面的 2 和 3 分别加上 1, 以保证 a, b间的差值最小。
此时分解出来的是 3,4,1 , 第三个数 还剩下一个 1, 显然不能使乘积最大, 所以我们再次从后往前逐个加1, 知道第三个数为0.
从后往前加?
显然从前往后加会造成数字的重复。
接着用高精度来求乘积就好了(因为 n 最大为 10000)
【代码】
1 #include
2 #include
3
4 int n = 0, arr[200];5
6 std::vector ans; //high precision computation
7
8 inline void mulpty(const int&tmp) {9 int x = 0;10 for(int i = 0; i != ans.size(); i++) {11 ans[i] = ans[i] * tmp +x;12 x = ans[i] / 10;13 ans[i] %= 10;14 }15 while(x) {16 ans.push_back(x % 10);17 x /= 10;18 }19 }20 intmain() {21 scanf("%d", &n);22
23 for(int i = 1, sum = 0; ; i++) {24 arr[i] = i + 1;25 sum +=arr[i];26 if(sum == n) break;27 if(sum >n) {28 sum -=arr[i];29 arr[i] = n -sum;30 if(arr[i] <= arr[i-1]) {31 while(arr[i]) {32 for(int j = i - 1; j >= 1; j--) {33 if(!arr[i]) break;34 arr[j]++;35 arr[i]--;36 }37 }38 }39 break;40 }41 }42
43 for(int i = 1; arr[i] != 0; i++) {44 printf("%d", arr[i]);45 }46 ans.push_back(arr[1]);47 for(int i = 2; arr[i] != 0; i++) {48 mulpty(arr[i]);49 }50 printf("\n");51 for(int i = ans.size() - 1; i >= 0; i--) {52 printf("%d", ans[i]);53 }54
55 }
上面代码的arr数组表示分解出的数字,ans是用来求乘积的。
贪心 最大乘积 java_最大乘积|贪心算法|FOJ1698|TYVJ3024相关推荐
- 最大乘积|贪心算法|FOJ1698|TYVJ3024
[题目链接]TYVJ3024 最大乘积 [问题描述] 一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,-.现在你的任务是将指定的正整数 ...
- 算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较
在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的,我来给同学们整理一下. 一.算法思想 ...
- 牛客网:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
题目描述 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出描述: 满足条件的最大乘积 ...
- 离散数学·(不调用第三方库)普通矩阵乘积/关系矩阵乘积,理论+python代码实现
矩阵乘法如何计算? 普通矩阵乘法:第一个矩阵的列数等于第二个矩阵的行数. 矩阵关系运算前提: (1)第一个矩阵的列数等于第二个矩阵的行数. (2)两个矩阵的元素均是0或1. 这里以关系矩阵乘法为例: ...
- 部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题
packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...
- 最大乘积java_《算法入门经典》-最大乘积(java实现)
输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列.如果这个最大的乘积不是正数,应该输出-1(表示无解).1<=n<=18,-10<=Si<=10 输入: 3 2 4 ...
- leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别
这两道算法题的解题思路是差不多的,但是从整体上分析,乘积最大子序列之和是最大子序和的进阶.先来看看两道算法题的简单描述. 53.最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组 ...
- n分解后的最大乘积java_【编程题】乘积最大的拆分
题意:给出一个数n,将其拆分为若干个互不相等的数字的和,要求这些数字的乘积最大. 分析:我们可以发现任何一个数字,只要能拆分成两个大于1的数字之和,那么这两个数字的乘积一定大于等于原数.也就是说,对于 ...
- 基础算法:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
这里要注意的是当数字足够大的时候,我们要使用long long形式的类型,用来记录那个最大值 最大值共有四种情况: 三个正数:数字本身越大则乘积越大 两个负数一个正数:负负得正,所以两个负数最小,之积 ...
最新文章
- 然并卵:BF 科普 BF 解释器的 JS 实现
- php数组合并 要保持两个数组的键名都不变
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
- 公网访问_一文读懂阿里云访问公网的实现方式
- 【华为云技术分享】华为开发者大会HDC.Cloud带你探索强化学习三大挑战及落地实践
- 软件工程复习笔记 UML
- SAP MM ‘Pricing Date Control‘字段的理解
- python3读取本地_Python3 获取本机 IP
- Linux 符号链接与 inode
- 魔改部署自己专属的合成大西瓜(三:上线篇<踩坑篇>)
- js 实现PHP中的in_array()
- linux 内核同步机制之complete
- Logback 深入分析
- Python基础语言学习 day 6 ——列表的遍历、增删改、相关操作、函数和方法
- 软件测试测试用例—用户注册界面
- 声纹技术(一):声纹技术的前世今生
- ssm+vue学生网络作业管理系统java maven
- perl的Math::Combinatorics模块实现全排列
- 用IOS手机看epub小说,哪些阅读器APP更好用?
- [简历] PHP 技能关键字列表
热门文章
- 湛江计算机学校中专,湛江中专院校名单 湛江有哪些中专学校
- Gnocchi: 1、Gnocchi源码分析
- 作业帮上万个 CronJob 和在线业务混部,如何解决弱隔离问题并进一步提升资源利用率?
- 太酷炫了,用python绘制股票K线图!
- 毛泽东《浪淘沙·北戴河》气势磅礴
- Android 实现书籍翻页效果----完结篇
- 【网安神器篇】——WPScan漏洞扫描工具
- 为什么阿里的程序员成长如此之快?最新BAT大厂面试者整理的Android面试题目模板,涨姿势了!
- vscode python导入模块
- 电子计算机协会总体目标,d.l.l计算机协会2012年纳新计划书.doc