1. 程式人生 > >SCOI2006 整數劃分

SCOI2006 整數劃分

大意是,將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; }