题目链接:点击打开链接
题目大意:设 n 是一个正整数。现在要求将 n 分解为若干个自然数之和(要求这些自然数互不相同),使得自然数的成绩最大。输出这个最大的乘积。
解题思路:点击打开链接
AC 代码
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define mem(a,b) memset(a,b,sizeof a); #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int a[100],b[100]; int main() { int rs=0,len=0; for(int i=2;rs<=1100;i++) { a[len++]=i; rs+=i; } int n; while(~scanf("%d",&n)) { if(n<=4) // 没办法拆分成不同的数使乘积大于等于 (1*n) { //... continue; } rs=0; int k=0; for(int i=0;i<len-1;i++) { rs+=a[i]; if(n-rs<a[i+1]) { b[k++]=a[i]; rs=n-rs; int j=k-1; while(1) { b[j--]+=1; rs--; if(rs<=0) break; if(j==-1) j=k-1; } break; } else if(n-rs==a[i+1]) { b[k++]=a[i]; b[k++]=a[i+1]; break; } else b[k++]=a[i]; if(rs<=0) break; } printf("%d",b[0]); for(int i=1;i<k;i++) printf(" %d",b[i]); puts(""); } return 0; }