题意简述
给定一个整数 ,请构造一个 的矩形,每次只留下最上面一行,并将最上面一行的个数累加进 。求 的值。
解题思路
首先这是一道贪心。
我们要让总和最大,就是要让第一行最大。
但是显然,如果 为 ,答案就为 ,显然无法取到最优解,所以我们要稍加改变。
读题可知 且 ,这样就是在求 除一以外的最小约数。递归即可。
这里有几点要注意一下:
-
可能是个素数,而我们枚举最小约数是到 。所以在这种情况下只能使 。
-
最后要将 ,因为最后肯定还剩下一个。
代码实现
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int main() {
scanf("%d",&n);
while(n>=1) {
bool flag=false;
for(int i=2;i<=sqrt(n);i++) {
if(n%i==0) {
ans+=n; n/=i;
flag=true; break;
}
}
if(!flag) { ans+=n; break;}
}
printf("%d",ans+1);
return 0;
}
//code by TheCedar
做完了这道题再看看这道题呦。