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. js中字符串的加密base64

    base64编码主要用在传输,存储表示二进制的领域,还可以进行加密和解密.其实就是字符串的编码和解码 btoa与atob 只能加密ascii,不能加密汉字. var str = 'I LOVE YOU ...

  2. 怎么在 CentOS 6 上配置私有 NPM 仓库?

    Sinopia 是一个简单易用的私有 NPM 仓库服务器.在 CentOS 6 上安装时,遇到如下报错(Node 版本 6.9.1) #error This version of node/NAN/v ...

  3. python小练习--银行取款

    银行取款 今天练习的小程序: #!/usr/bin/env python #-*- coding:utf-8 -*- import time tag=True while tag: name=inpu ...

  4. 2019-8-31-C#-标准性能测试高级用法

    title author date CreateTime categories C# 标准性能测试高级用法 lindexi 2019-08-31 16:55:58 +0800 2018-07-08 0 ...

  5. python 字符串匹配的应用

  6. [ 转]Linux进程关系

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux的进程相互之间有一定的关系.比如说,在Linux进程基础中,我们看到,每 ...

  7. docker-compose进入容器出现unable to find user root: no matching entries in passwd file

    解决办法: 先docker-compose stop 容器,再docker-compose start 容器.虽然这样可以很快 解决问题,但并非长久之计.

  8. docker的ubuntu镜像无ifconfig和ping命令

    docker的ubuntu镜像无ifconfig和ping命令 或者 ubuntu系统中无ifconfig 和 ping 解决方案: 执行以下鸣冷: apt-get update apt-get in ...

  9. 提高webpack的构建速度的几种方法概括

    通过externals配置来提取常用库 利用DllPlugin和DllReferencePlugin预编译资源模块,通过DllPlugin来对那些我们引用但是绝对不会修改的npm包来进行预编译,再通过 ...

  10. 枚举在switch中的运用

    Season.java package com.sxt.utils.enum2; public enum Season { 春,夏,秋,冬; } TestSeason.java package com ...