SCOI2006 整數劃分
阿新 • • 發佈:2019-02-10
大意是,將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;
}