纪中2159. max 洛谷P1249 最大乘积

说明:这两题基本完全相同,故放在一起写题解

纪中2159. max

(File IO): input:max.in output:max.out

时间限制: 1000 ms  空间限制: 262144 KB  具体限制

Goto ProblemSet

题目描述

一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
现在你的任务是将指定的正整数n分解成m个(m>=1)互不相同的自然数的和,且使这些自然数的乘积最大。

输入

只一个正整数n,(3≤n≤10000)。

输出

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。

样例输入

10

样例输出

2 3 5
30

数据范围限制

30%的数据  3<=n<=100

洛谷P1249 最大乘积

题目描述

一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。

现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。

输入格式

只一个正整数n,(3≤n≤10000)。

输出格式

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。

第二行是最大的乘积。

输入输出样例

输入 #1复制

10
输出 #1复制

2 3 5
30

Solution

考试前,很久、很久、很久之前,我在嵊州与同学一起刷题。随机跳到了这道题,但是都不会。

于是,愉快的放弃了……

于是,今天,我死了。

Algorithm1

尝试用dfs暴力的算。

(对后面的找规律十分重要)

Code1

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
using namespace std; IL int read()
{
re int res=;
re char ch=getchar();
while(ch<''||ch>'')
ch=getchar();
while(ch>=''&&ch<='')
res=(res<<)+(res<<)+(ch^),ch=getchar();
return res;
}
int n,maxans;
bool use[];
int q[];
int tail;
int ans[];
int maxlen;
IL void dfs(int depth,int sum,int times)
{
if(sum==n){
if(maxans<times){
memset(ans,,sizeof(ans));
for(int i=;i<tail;i++) ans[i]=q[i];
maxlen=tail;
maxans=times;
}
return;
}
if(sum>n) return;
for(int i=;i+sum<=n;i++)
{
if(!use[i]){
q[tail++]=i;
use[i]=;
dfs(depth+,sum+i,times*i);
q[--tail]=;
use[i]=;
}
}
}
int main()
{
// freopen("max.in","r",stdin);
// freopen("max.out","w",stdout);
n=read();
dfs(,,);
for(int i=;i<maxlen;i++) cout<<ans[i]<<" ";
cout<<endl<<maxans;
return ;
}

Code1

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

table

Algorithm2

尝试找规律

首先,1肯定是不能取的(1本身除外)(这不是废话吗?占总和又不算乘积的说……)

有一些特别的数,比如5,

它与比它小的数字不一样:

5被分成了2,3

但是比5小的数只被分成了一个数

像这样的数,还有很多,比如:

9:2,3,4

14:2,3,4,5

20:2,3,4,5,6

………………

于是我们就可以猜着说:

如果一个数可以被分成从2开始的连续的一串数字之和

那么这些数字就是这个数的“最大乘积”。

要是不能分成这样子呢?

还是先把它分成这样子,看看剩下来的数字吧

例如:

5被分成2,3

6不能正好分成从2开始连续的数字串

但是它被分成了2,3+1

7则被分成了2+1,3+1

8则被分成了2+1,3+2

9可以正好分成从2开始连续的数字串

……………………

那不就先减,减到不能减,再将2,3,4,5,6……这个数字串从右到左,再从右到左反复+1嘛!

(+1的过程也可以用除法和余数实现)

最后求乘积可是要用高精度的呦!

Code2

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
using namespace std;
int n;
int arr[];
int a[];
int main()
{
// freopen("max.in","r",stdin);
// freopen("max.out","w",stdout);
cin>>n;
int i=;
while(n-i>=) n-=i++;i--;
for(int j=;j<=i;j++)
arr[j]=j;
if(n)//现在有i-1个数
{
int j;
for(j=;j<=i;j++) arr[j]+=n/(i-);
for(j=i;j>=i+-n%(i-);j--) arr[j]++;
}
for(int j=;j<=i;j++) cout<<arr[j]<<" ";
a[]=;
for(int j=;j<=i;j++)
{
for(int k=;k<;k++)
{
a[k]*=arr[j];
}
for(int k=;k<;k++)
{
a[k+]+=a[k]/;
a[k]%=;
}
}
cout<<endl;
bool flag=;
for(int j=;j>=;j--)
{
if(a[j]) flag=;
if(flag) cout<<a[j];
}
return ;
}

Attention

这道题的数据范围也比较小,所以就不需要做那些省时间的高精度操作了

纪中23日c组T2 2159. 【2017.7.11普及】max 洛谷P1249 最大乘积的更多相关文章

  1. 纪中23日c组T3 2161. 【2017.7.11普及】围攻 斐波那契数列

    2161. 围攻 (File IO): input:siege.in output:siege.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   Goto Prob ...

  2. 纪中21日c组T2 2117. 【2016-12-30普及组模拟】台风

    2117. 台风 (File IO): input:storm.in output:storm.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto Proble ...

  3. 纪中20日c组T2 2122. 【2016-12-31普及组模拟】幸运票

    2122. 幸运票 (File IO): input:tickets.in output:tickets.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto P ...

  4. 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并

    洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...

  5. 纪中18日c组模拟赛

    T2 GMOJ2127. 电子表格 (File IO): input:excel.in output:excel.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   ...

  6. 纪中20日c组模拟赛T1 2121. 简单游戏

    T1 2121. 简单游戏 (File IO): input:easy.in output:easy.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto Pro ...

  7. 纪中21日c组T1 1575. 二叉树

    1575. 二叉树 (File IO): input:tree.in output:tree.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   Goto Probl ...

  8. 纪中21日c组模拟赛

    AWSL  AWSL  AWSL  AWSL AWSL  AWSL  AWSL  AWSL AWSL  AWSL  AWSL  AWSL AWSL  AWSL  AWSL  AWSL 题解传送 T1  ...

  9. 纪中20日c组模拟赛

    赛后感想 多写点东西总是好的,但是在最后,算法就不要改动了(就这样我少了10分) 题解 T1 2121. 简单游戏 T2 2122. 幸运票

随机推荐

  1. 三、通过 FactoryBean 来配置bean

    一般情况下,Spring 通过反射机制利用 <bean> 的 class 属性指定实现类实例化 Bean ,在某些情况下,实例化 Bean 过程比较复杂,如果按照传统的方式,则需要在 &l ...

  2. Exchange2010安装指南

    安装流程参考下面的: https://jingyan.baidu.com/article/2c8c281d6893680008252a9c.html 安装环境:windows server 2008( ...

  3. 二、UDP

    1 端口号 在计算机网络和电磁信号理论中,对共享同一通信信道的多个信号进行区分是个常见的问题.多路复用(multiplexing)就是允许多个会话共享同一介质或机制的一种解决方案. 使用不同的频率来区 ...

  4. Codeforces_490_E

    http://codeforces.com/problemset/problem/490/E dfs,过程要注意细节,特别是当前位置取了与上个数当前位置相同是,若后面不符合条件,则当前位置要重置'?' ...

  5. Mysql 5.7.18:主从复制,io优化

    #目录 #挂盘#时间同步#master节点,进行如下操作: #下载安装 #初始化 #配置文件 #开机启动 #服务启动 #初始数据库#slave节点,进行如下操作: #下载安装 #初始化 #配置文件 # ...

  6. k8s系列----索引

    day1:k8s集群准备搭建和相关介绍 day2:k8spod介绍与创建 day3:k8sService介绍及创建 day4:ingress资源和ingress-controller day5:存储卷 ...

  7. HTML页面缓存

    引出问题: 在做完一个项目迭代上线的时候遇到一个问题:Ht代码部署在nginx里面,当我打包的H5代码上传把之前代码替换掉之后,如果手机端之前有打开过相关的页面,那么在代码上传成功后再次打开,回出现一 ...

  8. 实验一 GIT 代码版本管理

    实验一  GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)   熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git ...

  9. VS2015中使用qt开发客户端,QPluginLoader加载dll为null的解决办法

    1,问题重现: 使用vs2015开发一款qt软件,使用了QPluginLoader动态加载插件的方式,调试的时候,发现dll模块没有加载进来,debug发现QPluginLoader的instance ...

  10. JS循环解决任意日期间的间隔天数

    用JS循环解决任意日期间的间隔天数,并求截止日期是周几 y1=1900 m1=1 d1=1 y2=2000 m2=5 d2=3 days=0 ydays=0 mdays=0 ddays=d2-d1 f ...