纪中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. 每日一练_PAT_B_PRAC_1004客似云来

    题目描述 NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,就会每天都过来:并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝.于是,这 ...

  2. selenium 调用JavaScript代码

    selenium 调用JavaScript代码 调用JavaScript方法有两种: execute_script(): 方法解释:是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕. ...

  3. python 迭代器和生成器详解

    一.迭代器 说迭代器之前有两个相关的名词需要介绍:可迭代对象:只要定义了__iter__()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器.迭代器:实现了__next__()或者next ...

  4. Codeforces_734_D

    http://codeforces.com/problemset/problem/734/D 保存最近的八个方向的点,判断即可. #include<iostream> #include&l ...

  5. overflow:hidden;zoom:1;外框自适应 [转]

    在排页面时,碰到了,外框里的元素用fluid 布局,外框的高度不能适应的问题,查了一下资料,发现了博友的一篇文章,解决了这个问题,现在分享给大家. 解释不到位的请大牛补充~~~~~~ 高度自适应: h ...

  6. angularJS 传参的四种方法

    AngularJS - Passing data between pages 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Ye Huang链接:https://www.z ...

  7. ElasticSearch基础入门学习笔记

    前言 本笔记的内容主要是在从0开始学习ElasticSearch中,按照官方文档以及自己的一些测试的过程. 安装 由于是初学者,按照官方文档安装即可.前面ELK入门使用主要就是讲述了安装过程,这里不再 ...

  8. django项目中使用KindEditor富文本编辑器

    先从官网下载插件,放在static文件下 前端引入 <script type="text/javascript" src="/static/back/kindedi ...

  9. dubbo-admin dubbo-monitor 安装

    dubbo-admin: 因为我们不能直观的看到dubbo和zk上到底有什么服务(提供者),所以我们需要一个可视化工具来方便我们管理每一个服务和每一个节点.dubbo-admin 就是dubbo的管理 ...

  10. python os和sys模块使用

    python os和sys模块使用 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相 ...