gdufs 1237 最优分解问题

  题目链接:http://cstfs.gdufs.edu.cn:8080/JudgeOnline/problem.jsp?id=1237 (好像是内网的0.0)

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

  分解为不相同的数确实有点难(若没这个限制的话直接就把它分成若干个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 }

 

转载于:https://www.cnblogs.com/Newdawn/p/4116595.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值