给出n,把n分解为若干不相同数之和,使之乘积最大。
贪心,Discuss里面的思路:把n分解为从2开始的连续整数,如果有多,则从高位开始依次加1。如26,我们得到2+3+4+5+6,此时还剩余6(26-2-3-4-5-6),接下来从高位依次加一,变成3+4+5+6+7,还剩1,继续加给最大的7,最后答案是3+4+5+6+8
#include <iostream> #include <cstdio> using namespace std; int main() { // freopen("in.txt","r",stdin); int m,s=0,cnt=0,i,sum,j; cin >> m; for(i=2;;i++) { s+=i; cnt++; if(s>m) { s=s-i; //9 i--; //4 cnt--; //3 break; } } // cout << s << endl; // cout << i << endl; // cout << cnt << endl; s=m-((i)*(i+1)*0.5-1); // cout << s << endl; sum=s/cnt; //6 if(sum>0) { s=s-sum*cnt; //2 } // cout << sum << endl; // cout << s << endl; cout << (2+sum); for(j=3;j<=i-s;j++) { cout << ' ' << (j+sum); } for(j=i-s+1;j<=i;j++) { cout << ' ' << (j+sum+1); } return 0; }