gdufs 1237 最优分解问题

  题目链接:http://cstfs.gdufs.edu.cn:8080/JudgeOnline/problem.jsp?id=1237

  简单来说,这道题目就是把一个数分解为若干个互不相同的数使得乘积最大。

  分解为不相同的数确实有点难(若没这个限制的话直接就把它分成若干个3来解决即可,可以证明得到的)
  首先可以想到分解出来的数肯定是很接近的,甚至是连续的,而且如上所说我们可以从 2开始分解(1就不要考虑了,有等于无,1*任何数都为原数)
  然后从 2开始一直不断累加,直到累加的结果很接近 n,然后,重点就是如何处理剩下的那部分了,如果把它直接加给累加的最后一个数(i)的话那么就会拉开 i和 i-1的距离了,所以我们从 2开始,不断进行尝试,看累加后有没和已经得到的数列重复,一旦找到合适的那么就是最后的结果了。
  最后说一句,鉴于广外OJ的超弱数据,我也不知道我的思路有没错,而且所有的处理均为暴力,我连中间可以用累加和的公式来处理的都跳过了,直接暴力地递增累加(0.0)

 1 #include<iostream>
 2 using namespace std;
 3 typedef long long LL;
 4
 5 int main(){
 6     LL n,i,j;
 7     cin>>n;
 8     LL sum= 0, ans= 1;
 9     for(i=2; ; ++i){
10         if(sum+i > n)    break;
11         sum+= i;
12         ans*= i;
13     }
14     --i;
15     int remain= n-sum;
16     for(j=2; j<=i; ++j)
17         if(j+remain > i){
18             ans= ans/j*(j+remain);
19             break;
20         }
21     cout<<ans<<endl;
22     return 0;
23 }
时间: 2024-11-07 17:24:04

gdufs 1237 最优分解问题的相关文章

HUNNU-10307-最优分解问题

点击打开题目连接 # include <queue> # include <cstdio> # include <cstring> # include <iostream> # include <algorithm> using namespace std; int v[4] = {1,10,100,1000},a[100000]; struct BigNumber{ int d[1000]; BigNumber() { memset(d,0,s

11091 最优自然数分解问题(贪心)

11091 最优自然数分解问题 时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: C++;C;VC;JAVA Description 问题描述:设n是一个正整数. (1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大. (2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大. 编程任务:对于给定的正整数n,编程计算问题(1)和(2)的最优分解的最大乘积. 注意: 1. 这里的自然数不含0但允许为1. 2. 特别地

算法设计与分析 - 李春葆 - 第二版 - pdf-&gt;word v3

1 1.1 第1章─概论 2 3 1.1.1 练习题 4 1. 下列关于算法的说法中正确的有( ). 5 Ⅰ.求解某一类问题的算法是唯一的 6 Ⅱ.算法必须在有限步操作之后停止 7 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 8 Ⅳ.算法执行后一定产生确定的结果 9 A. 1个 B.2个 C.3个 D.4个 10 2. T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是( ). 11 A.T(n)= T(n-1)+1,T(1)=1 B.T(n)= 2n2 12 C.T(n)

基础搜索算法题解(N-R)

练习链接:http://acm.njupt.edu.cn/vjudge/contest/view.action?cid=171#overview N题 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4398 Accepted: 2520 Description You have just been put in charge of developing a new shredder for

算法导论读书笔记(17)

算法导论读书笔记(17) 目录 动态规划概述 钢条切割 自顶向下的递归实现 使用动态规划解决钢条切割问题 子问题图 重构解 钢条切割问题的简单Java实现 动态规划概述 和分治法一样, 动态规划 (dynamic programming)是通过组合子问题的解而解决整个问题的.分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.与此不同,动态规划适用于子问题并不独立的情况,即各子问题包含公共的子子问题.在这种情况下,分治法会重复地求解公共的子子问题.而动态

POJ1141 Brackets Sequence (dp动态规划,递归)

本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ] [ j ] 表示添加括号的个数, pos[ i][ j ] 表示 i , j 中哪个位置分开,使得两部分分别匹配. pos [ i ][ j ] 为-1的时候,说明i, j 括号匹配. 初始值置dp [ i ] [ i ]  = 1; 如果只有一个括号,那么匹配结果必然是差1. 首先判断括号是

二维平面三角划分

1 INTRODUCTION 在OpenGL中,为了更方便的提供能对符合条件的多边形进行快速渲染,对合法的多边形做出条件限制.已知对于空间中的多边形P的分割是等价于原始多边形P的一系列互不相交的多边形的并集.为了最大限度的提高性能,同时解决在三维空间中绘制的凹多边形在旋转时发生的闪烁问题.在系统研究学习CGAL三角划分算法的基础上,对算法的性能进行分析,得出适合本课题的算法方案. 2 POLYGON PARTITIONING 多边形划分有诸多算法,本文通过函数random_polygon_2产生

POJ 1416-Shredding Company(DFS+更新路径)

题目链接:传送门 题意:给一个目标值goal,然后再给一个数num,将num分解,比如 给目标值50,num为12346 num可以分解为 1   2   34   6 这么4部分,要求部分和尽量接近目标值但不能大于目标值,求最优分解: 思路:深搜每次分割部分的起点,更新最优解的时候更新一下路径,以前也是被路径打印给困惑了,其实和更新最优值思想一样,可以设一个ans_path[] 数组,更新最优值的时候顺便更新一下最优路径就行了.. #include <algorithm> #include

【Spark深入学习 -14】Spark应用经验与程序调优

----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调优经验 3.1 Spark原理及调优工具 3.2 运行环境优化 3.2.1 防止不必要的分发 3.2.2 提高数据本地性 3.2.3 存储格式选择 3.2.4 选择高配机器 3.3 优化操作符 3.3.1 过滤操作导致多小任务 3.3.2 降低单条记录开销 3.3.3 处理数据倾斜或者任务倾斜 3.