Time Limit: 1 second

Memory Limit: 32 MB

【问题描述】

一个正整数一般可以分为几个互不相同的自然数的,如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

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=a602

【题解】



注意这里是说分解成若干个不同的;不能有相同的;

首先考虑分解后的情况.

假设一个数字为h;

分解成两个部分a,h-a;

然后考虑它们的乘积与h的大小关系

令f(a)=a*(h-a)-h

=a*h-a*a-h

=(a-1)*h-a*a

这里让a< h/2(因为要不同嘛,就假设a< h-a呗->a< h/2)

则h>2*a

则f(a)>(a-1)*2a-a*a

->f(a)>a*a-2*a;

->f(a)>a(a-2);

也就是说如果a>=2的话

f(a)>a(a-2)>=0

即f(a)>0

也即a*(h-a)>h

所以如果分成的若干个不同的数,它们都大于1的话,那么分成的乘积肯定比原来的大;

这里;再展示一个事实;

设h=2*s

假设他分成了

s-1和s+1

那么乘积为s^2-1

如果分成了

s-2和s+2

那么乘积为s^2-4

也就是说分成的两个数a,b

它们的差的绝对值越小;

它们的乘积就相应地越大;

这样我们可以先选取连续的自然数

2,3,4,5….x

这里(2+x)*(x-1)/2<=n

然后令temp = n-(2+x)*(x-1)/2

如果tmep=0

那么因为是连续的自然数,那么它们的差肯定是最小的;(差都是1);

则直接输出2,3,4..x就好

如果temp>0;

那么就把temp平均地分配到前面的数字里面去;

当然你要从后往前一个一个地分配

比如

n=13

2 3 4

13-(2+3+4)=4

则分配两个1给4,然后2和3分别给它们分配一个1(在平均的情况下尽量先分配后面的)

->3 4 5

这样就能保证差的绝对值相对地小;

最后的成绩也就越大;

(在数学推导上的贪心?)

最后数字很大要写个高精度乘单精度;

(n=3和4的情况特判一下)



【完整代码】

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
#define pb push_back
#define LL long long const int MAXN = 100; int n,now;
LL a[1000];
vector <LL> v; int main()
{
scanf("%d",&n);
if (n==3 || n==4)
{
printf("%d %d\n%d",1,n-1,n-1);
return 0;
}
v.pb(2);n-=2;now=3;
while (n >= now)
{
n-=now;
v.pb(now);
now++;
}
now = v.size()-1;
while (n)
{
v[now]++;
now--;
n--;
if (now==-1)
now = v.size()-1;
}
a[1] = 1;
int le = 1,len = v.size();
for (int i = 0;i <= len-1;i++)
{
int x = 0;
for (int j = 1;j <= le;j++)
{
a[j] = a[j]*v[i] + x;
x = a[j]/10;
a[j]%=10;
}
while (x>0)
{
le++;
a[le] = x;
x = a[le]/10;
a[le]%=10;
}
}
for (int i = 0;i <= len-1;i++)
{
printf("%I64d",v[i]);
if (i==len-1)
puts("");
else
putchar(' ');
}
for (int i = le;i >= 1;i--)
printf("%I64d",a[i]);
return 0;
}

【a602】最大乘积的更多相关文章

  1. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. C语言 · 最小乘积(基本型)

    问题描述 给两组数,各n个. 请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小.要求程序输出这个最小值. 例如两组数分别为:1 3 -5和-2 4 1 那么对应乘积取和的最小 ...

  3. 最大连续子序列乘积(DP)

    题目来源:小米手机2013年校园招聘笔试题 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含多个测试样例.每个测试样例的第一行仅包含正整数 ...

  4. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  5. CentOS 7 ssh脚本 求两个数值的“和”,“乘积”,”商“

    1:在目录下创建一个  sh文件 touch 1.sh 2:进入sh文件书写sh脚本 #!/bin/bash read -p "请输入第一个数值" A read -p " ...

  6. NOIP2000乘积最大[序列DP]

    题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...

  7. n数乘积第m小

    这是从Java贴吧看到的一道面试题,看了别人的解题思路实现的.... 如题: n个数,他们的乘积可得到一些其它的数,求第m小的. 输入格式: n m n1 n2 n3 ... 例: 输入: 3 8 2 ...

  8. 【wikioi】1017 乘积最大

    题目链接 算法:划分型DP 非常典型的一道题目,划分型DP 题目描述: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大.同时,为了 ...

  9. 最大乘积 Maximun Product

    最大乘积 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/B 题意: 输入n个元素组成的序列s,你需要 ...

随机推荐

  1. MySQL数据库操作语句(cmd环境运行)

    一.开启MySQL服务器 1,  通过windows提供的服务管理器来完成 windows键+R 输入: services.msc 2.在本地服务中打开其服务 3.在DOC命令行下 net stop ...

  2. 读JS高性能总结——DOM编程(一)

    DOM是一个与语言无关的API,它在浏览器中的借口却是用JS来实现的. 浏览器通常会把DOM和JS独立实现. 在IE中,JS的实现名是JScript,位于jscript.dll文件中,DOM实现则是m ...

  3. Intersection of Two Linked Lists两链表找重合节点

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  4. LeetCode169 Majority Element, LintCode47 Majority Number II, LeetCode229 Majority Element II, LintCode48 Majority Number III

    LeetCode169. Majority Element Given an array of size n, find the majority element. The majority elem ...

  5. 2019.10.22 用TCP实现服务端并发接收

    client import socket client = socket.socket() client.connect( ('127.0.0.1',8888) ) while 1: msg = in ...

  6. Hello World 之Spring Boot 调用图数据库Neo4j

    明日歌 [清]钱鹤滩 明日复明日,明日何其多! 我生待明日,万事成蹉跎 1. 图数据库Neo4j之爱的初体验 ----与君初相识,犹似故人归 在如今大数据(big data)横行的时代,传统的关系型数 ...

  7. Spring中使用DataSourceTransactionManager进行事务管理的xml配置

    在一个业务的实现过程中,可能需要多条sql完成对数据库的操作,比如账户登录,需要匹配用户名和密码,然后要增加积分,还要记录登录的ip和时间,这可能需要三个sql语句,这三个语句应当是一个整体,任意一个 ...

  8. 集合案例--对ArrayList容器中的内容进行排序

    package com.Set; import java.util.ArrayList; import java.util.Collections; import java.util.Comparat ...

  9. sql函数的使用——系统函数

    n  sys_context 1)terminal:当前会话客户所对应的终端的标识符 2)lanuage:语言 3)db_name:当前数据库名称 4)nls_date_format:当前会话客户端所 ...

  10. 判断php的运行模式

    我们一般情况下,都是在apache下面运行我们的php程序,当然也有些人是用IIS环境的 我们要是想知道我们目前运行的环境是什么的话,那我们可以用函数php_sapi_name()来测试 代码: &l ...