poj 1032 拆分数字使乘积最大
2015-08-17 10:50
363 查看
参考:http://www.cnblogs.com/rainydays/archive/2012/12/17/2821428.html
题意:给出一个数n,将其拆分为若干个互不相等的数字的和,要求这些数字的乘积最大。
分析:我们可以发现任何一个数字,只要能拆分成两个大于1的数字之和,那么这两个数字的乘积一定大于等于原数。也就是说,对于连乘式中,如果将一个乘数a更换为两个数字b×c(a=b+c且b>1,c>1),那么乘积只可能增大或不变,不会减小。
所以我们拆分的原则就是将这些数字拆得尽量小,拆成许多2的乘积是最好的。
又因为题目约束各个数字不能相同,则我们拆分的结果最理想的情况是从2开始的公差为1的等差数列。但是有时是无法构成这样的等差数列的,因为构成到某一位时会出现构建下一位不够用的情况,例如,n=6时,6=2+3+1。当我们要构成4的时候只剩下1了。如果余数是1,那么我们必然要加到前面的某一个数字上,否则乘积无法增大。如果是大于1的数,也必须加在前面的某些数字上,否则如果单乘会出现重复数字。
先看看这个余数的范围。假设构造好的数列为2...k一共k-1个数字,那么这个余数必然≤k,否则可以继续构造数列。
唯一可以避免数字重复的方法是将这些1从最大的数字开始依次向较小数分配,让每个乘数增加1。如果余数小于k,那么这样做没问题。还有可能仍然剩余1(余数为k的时候),此时只能将这个1加在最大的乘数上。
题意:给出一个数n,将其拆分为若干个互不相等的数字的和,要求这些数字的乘积最大。
分析:我们可以发现任何一个数字,只要能拆分成两个大于1的数字之和,那么这两个数字的乘积一定大于等于原数。也就是说,对于连乘式中,如果将一个乘数a更换为两个数字b×c(a=b+c且b>1,c>1),那么乘积只可能增大或不变,不会减小。
所以我们拆分的原则就是将这些数字拆得尽量小,拆成许多2的乘积是最好的。
又因为题目约束各个数字不能相同,则我们拆分的结果最理想的情况是从2开始的公差为1的等差数列。但是有时是无法构成这样的等差数列的,因为构成到某一位时会出现构建下一位不够用的情况,例如,n=6时,6=2+3+1。当我们要构成4的时候只剩下1了。如果余数是1,那么我们必然要加到前面的某一个数字上,否则乘积无法增大。如果是大于1的数,也必须加在前面的某些数字上,否则如果单乘会出现重复数字。
先看看这个余数的范围。假设构造好的数列为2...k一共k-1个数字,那么这个余数必然≤k,否则可以继续构造数列。
唯一可以避免数字重复的方法是将这些1从最大的数字开始依次向较小数分配,让每个乘数增加1。如果余数小于k,那么这样做没问题。还有可能仍然剩余1(余数为k的时候),此时只能将这个1加在最大的乘数上。
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <cstdlib> using namespace std; #define clc(s,t) memset(s,t,sizeof(s)) #define INF 0x3fffffff #define N 1005 int n; int s ; int main(){ int i,j,k; scanf("%d",&n); j = n; for(i = 1;j>s[i-1];i++){ s[i] = i+1; j -= (i+1); } for(k = i-1;k>=1&&j;k--,j--)//从大到小构造序列 s[k] ++; if(j)//如果仍然有剩余 s[i-1]++; for(k = 1;k<i;k++) printf("%d ",s[k]); putchar('\n'); return 0; }
相关文章推荐
- php des和 java des
- windows服务创建工具srvany.exe介绍
- 背景色默认值引出的一系列问题
- 随机点名软件
- 求前100个斐波那契数
- linux install zh_CN(ubuntu)
- Spring 学习笔记(五)——MVC
- 转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】
- windows下 python 2.7x 安装pip
- MPAndroidChart API用法
- 19.5 Partition Selection 分区查询
- 火狐浏览器插件vimperator的常用命令
- 运算符优先级
- DispatcherServlet讲解
- UIWebView与JS的深度交互
- 利用小工具instsrv和srvany 创建windows服务
- C、C++多组输入方法
- LeetCode:Maximum Depth of Binary Tree
- UIWebView与JS的深度交互
- UIWebView与JS的深度交互