(同步个人博客 http://sxysxy.org/blogs/34 到csdn
题目 http://www.lydsy.com/JudgeOnline/problem.php?id=1263
大意是,将n划分成n = a1+a2+…..使得划分出来的a1,a2……乘积最大
一眼感觉是数学题。但是最后还是百度了一波才了解,要尽量划分出3,如果不能划分出3那就划分出2。
为什么呢?问了问学长(%%神犇Fmuckss),他意思是可以函数求极值解决。 我们观察一下函数图像,样例的例子n = 13,尽量每一份都分成x的话,那就是 x^(13/x),图像画出来
这个函数的求导我并不会qaq。 大概就是这样,对于x^(n/x)函数取到极大值。当然这个题木要求划分的是整数。所以如果最后考虑特判一下n <= 4的情况,如果n == 4那就再乘4(其实是乘两次2),如果n == 3还乘2,如果n == 2乘2,n == 1根本不用管….
于是这样就ac了:
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdarg>
using namespace std;
class Big
{
public:
vector<int> bits;
void mul(int n) //大数乘int
{
for(int i = 0; i < bits.size(); i++)
bits[i] *= n;
for(int i = 0; i < bits.size(); i++)
{
if(bits[i] >= 10)
{
if(i + 1 < bits.size())
bits[i+1] += bits[i]/10;
else
bits.push_back(bits[i]/10);
bits[i] %= 10;
}
}
}
};
int main()
{
int n;
scanf("%d", &n);
Big a;
a.bits.push_back(1);
while(n > 4)
{
a.mul(3);
n -= 3;
}
if(n == 4)
a.mul(4);
else if(n == 3)
a.mul(3);
else
a.mul(2);
reverse(a.bits.begin(), a.bits.end());
printf("%d\n", (int)a.bits.size());
int olen = min(100, (int)a.bits.size());
for(int i = 0; i < olen; i++)
putchar(a.bits[i]|0x30);
return 0;
}