题意:给出一个数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的数,也必须加在前面的某些数字上,否则如果单乘会出现重复数字。对于一个余数,应该每次将余数中的一个1分配给数列中最小的数字,这样才能使得乘积每次增大的幅度最大,因为增加量是所有除了最小乘数之外的数字的乘积。但是这样做会造成数字重复,所以唯一可以避免数字重复的方法是将这些1从最大的数字开始依次向较小数分配,让每个乘数增加1。但是这样仍然可能有剩余,但最多剩余1,因为再多就足够构成下一个乘数的了,同样为了避免重复,我们只能将这个1加在最大的乘数上。

/*
* POJ_1032.cpp
*
* Created on: 2013年11月25日
* Author: Administrator
*/ #include <iostream>
#include <cstdio> using namespace std; const int maxn = 1005;
int ans[maxn]; int main(){
int n;
while(scanf("%d",&n)!=EOF){ int total = 0;
int i = 2;
while(total + i <= n ){
total += i;
ans[i-2] = i;
++i;
} n -= total;
i = i-3;
total = i; while(i >= 0 && n > 0){
--n;
ans[i]++;
--i;
} if(n>0){
ans[total]++;
} bool first = true;
for(i = 0 ; i <= total ; ++i){
if(!first){
cout<<" ";
}
first = false;
cout<<ans[i];
}
} return 0;
}

(Relax 水题1.2)POJ 1032 Parliament(将n分解成若干个互不相等的整数的和,并且是这些整数的乘积最大)的更多相关文章

  1. poj 1032 Parliament 【思维题】

    题目地址:http://poj.org/problem?id=1032 Parliament Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  2. Poj 1032 Parliament

    Parliament Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19103   Accepted: 8101 Descr ...

  3. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  4. POJ 1488 Tex Quotes --- 水题

    POJ 1488 题目大意:给定一篇文章,将它的左引号转成 ``(1的左边),右引号转成 ''(两个 ' ) 解题思路:水题,设置一个bool变量标记是左引号还是右引号即可 /* POJ 1488 T ...

  5. POJ 水题若干

    POJ 3176 Cow Bowling 链接: http://poj.org/problem?id=3176 这道题可以算是dp入门吧.可以用一个二维数组从下向上来搜索从而得到最大值. 优化之后可以 ...

  6. poj 3080 Blue Jeans(水题 暴搜)

    题目:http://poj.org/problem?id=3080 水题,暴搜 #include <iostream> #include<cstdio> #include< ...

  7. POJ 水题(刷题)进阶

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  8. POJ 3984 - 迷宫问题 - [BFS水题]

    题目链接:http://poj.org/problem?id=3984 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, ...

  9. [POJ 1000] A+B Problem 经典水题 C++解题报告 JAVA解题报告

        A+B Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 311263   Accepted: 1713 ...

随机推荐

  1. ASP.NET 实现上一篇文章 下一篇文章

    select top 1 * from job_hrnews where newsid>162  --下一篇 select top 1 * from job_hrnews where newsi ...

  2. WEB前端开发规范文档(转)

    http://codeguide.bootcss.com/  编写灵活.稳定.高质量的 HTML 和 CSS 代码的规范上面的文档 再结合下面的规范: 无论是从技术角度还是开发视角,对于web前端开发 ...

  3. 免写前缀JS包--prefixfree.min.js--插件

    /** * StyleFix 1.0.3 & PrefixFree 1.0.7 * @author Lea Verou * MIT license */ (function(){functio ...

  4. expdp 备份数据库

    操作系统层面创建目录 [root@Oracle10g ~]# mkdir -p /home/oracle/db_back/ 2. 修改目录的所属用户.所属组 [root@Oracle10g ~]# c ...

  5. [转]Delphi中进行延时的4种方法

    1.挂起,不占CPU sleep 2.不挂起,占cpu procedure Delay(msecs:integer); var FirstTickCount:longint; begin FirstT ...

  6. 【USACO 2.3.4】货币系统

    [描述] 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...

  7. shell每日发邮件

    LOGFILE="$fank/"`date +"%Y%m%d"`"data"#每日文件 from="abc@123.com&quo ...

  8. 无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”。请改用适用的接口。

    引用里找到Microsoft.Office.Interop.Word右键属性 在嵌入互操作类型里,选上False就行了.

  9. javascript 计时器,消失计时器

    var setId= setInterval(function () { alert('点我'); }, 1000); onload = function () { //消灭计时器 clearInte ...

  10. 【行为型】Strategy模式

    策略模式意图将解决问题的算法分别封装成一个个对象的形式,并使这些算法对象相互间可被替换.模式比较简单,对于策略对象结构的设计,可抽象一个抽象基类,并定义好相关算法(纯)虚接口,并由各种具体的实现算法子 ...