纪中23日c组T2 2159. 【2017.7.11普及】max 洛谷P1249 最大乘积
纪中2159. max 洛谷P1249 最大乘积
说明:这两题基本完全相同,故放在一起写题解
纪中2159. max
(File IO): input:max.in output:max.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
一个正整数一般可以分为几个互不相同的自然数的和,如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)。
输出格式
第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。
输入输出样例
10
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 最大乘积的更多相关文章
- 纪中23日c组T3 2161. 【2017.7.11普及】围攻 斐波那契数列
2161. 围攻 (File IO): input:siege.in output:siege.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto Prob ...
- 纪中21日c组T2 2117. 【2016-12-30普及组模拟】台风
2117. 台风 (File IO): input:storm.in output:storm.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto Proble ...
- 纪中20日c组T2 2122. 【2016-12-31普及组模拟】幸运票
2122. 幸运票 (File IO): input:tickets.in output:tickets.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto P ...
- 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并
洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...
- 纪中18日c组模拟赛
T2 GMOJ2127. 电子表格 (File IO): input:excel.in output:excel.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 ...
- 纪中20日c组模拟赛T1 2121. 简单游戏
T1 2121. 简单游戏 (File IO): input:easy.in output:easy.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto Pro ...
- 纪中21日c组T1 1575. 二叉树
1575. 二叉树 (File IO): input:tree.in output:tree.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto Probl ...
- 纪中21日c组模拟赛
AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL AWSL 题解传送 T1 ...
- 纪中20日c组模拟赛
赛后感想 多写点东西总是好的,但是在最后,算法就不要改动了(就这样我少了10分) 题解 T1 2121. 简单游戏 T2 2122. 幸运票
随机推荐
- [scrapy]安装报错: Twisted安装错误
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载whl文件 然后 pip install <whl文件名> 安装 Scrapy s ...
- Comb使用2
只需添加如下内容 AndroidManifest中添加如下 不要忘记修改application ID与Comb对应 最好不要采用将combSDK lib文件添加到工程中否则可能连接不了Comb 如果添 ...
- Keepalived & LVS: 实现web的负载均衡和高可用
目录 1. 环境介绍2. LVS DR模型中Realserver上的准备3. ha上的准备4. 配置keepalived5. 测试Realserver的切换6. failback页面测试7. keep ...
- 第2章 Java并行程序基础(二)
2.3 volatile 与 Java 内存模型(JMM) volatile对于保证操作的原子性是由非常大的帮助的(可见性).但是需要注意的是,volatile并不能代替锁,它也无法保证一些复合操作的 ...
- Go语言实现:【剑指offer】二进制中1的个数
该题目来源于牛客网<剑指offer>专题. 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1 ...
- MySQL :LAST_INSERT_ID()函数总结
作用:当对table进行insert操作时,返回具有Auto_increment(自动增长)特性的属性列的最新值. 该函数的特点 1.每当断开本次连接之后又重新连接时,该函数的返回值会被重置为0. 2 ...
- python中调用函数时,参数顺序与参数赋值问题
设置类和函数如下:class MM(): def ff(self,url(1),method(2),data=None(3),cookie=None(4)): if method.lower()==& ...
- .NET Core之单元测试(二):使用内存数据库处理单元测试中的数据库依赖
目录 定义一个待测试API 测试用例 为减少篇幅,隐藏了SampleEntity和SqliteDbContext 定义一个待测试API 如下,我们定义了一个名为Sample的API,其中有一个外部依赖 ...
- 工程引用libm.a文件的sin函数后
更改前后的main.c //#include <math.h> ; int var_bss; int main() { double d; // d = sin(3.14/2); ; } ...
- vue中阻止事件穿透的方法
默认情况下,事件在h5页面会穿透传递,比如一div里面套一个div,点击上层div,下层div也会响应 要阻止事件穿透,使用event.stopPropagation(); 代码示例: <div ...