纪中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. BIO、NIO

    1. BIO和NIO 我们平常使用的IO是BIO(Blocking-IO),即阻塞IO.而NIO(No-blocking-IO)则是非阻塞IO,二者有什么区别呢? 预先知识准备 同步:发起调用后,调用 ...

  2. 谈下程序设计算法的准备心得与体会-nCov隔离也许帮你提升能力

    最近武汉的n-Cov使得大家只能在家办公了. 在家里的感受是什么样的呢? 1.上班的时候一直在奔跑,现在总算可以有集中的时间来思考一些之前一直没能好好整理的内容 2.时间变得自己可以掌控,优先级有自己 ...

  3. springboot使用servlet

    基于注解方式: 基于配置类:

  4. 使用html及CSS实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部:

    使用html及CSS实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部: <!DOCTYPE html><html lang="en">< ...

  5. Codeforces 1092 F Tree with Maximum Cost (换根 + dfs)

    题意: 给你一棵无根树,每个节点有个权值$a_i$,指定一个点u,定义$\displaystyle value = \sum^v a_i*dist(u,v)$,求value的最大值 n,ai<= ...

  6. (七)mybatis批量操作,分页插件

    首先使用方式很简单: SqlSession sqlSession = sessionFactory.openSession(ExecutorType.BATCH); 批量操作核心:改变执行sql的方式 ...

  7. LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)

    题目: 给定一个"HH:MM"格式的时间,重复使用这些数字,返回下一个最近的时间.每个数字可以被重复使用任意次. 保证输入的时间都是有效的.例如,"01:34" ...

  8. 第2章 Java并行程序基础(二)

    2.3 volatile 与 Java 内存模型(JMM) volatile对于保证操作的原子性是由非常大的帮助的(可见性).但是需要注意的是,volatile并不能代替锁,它也无法保证一些复合操作的 ...

  9. 1.【Spring Cloud Alibaba】服务发现-Nacos

    一.服务的提供者与服务的消费者 二.服务发现原理 如果用户中心地址发生变化怎么办? 服务的消费者总能找到服务的提供者的这种原理,即服务发现原理. 三.什么是Nacos? Nacos文档地址请查看,引入 ...

  10. win 8.0.12

    一.下载 下载页面http://dev.mysql.com/downloads/mysql/ 选择系统平台后,点击download(根据系统选择64或32位) 二.配置 1.下载成功后,解压安装包到要 ...