題目
讀入乙個正整數n。要求將n寫成若干個正整數之和,並且使這些正整數的乘積最大。例如,n=13,則當n表示為4+3+3+3(或2+2+3+3+3)時,乘積=108為最大。輸入n
輸出思路
如何分解這個n,才能使乘積最大,這是此題的核心。
首先明白乙個定理:兩正數相差越小,其乘積就越大
證明過程如下
設正數n,y,x(n>y>x),比較n*(n-x)與n*(n-y)
我們用作差法,即用 n*(n-x)-n*(n-y)
⇒ n-x-n+y
⇒ y-x
∵ y>x
∴ n(n-x)>n(n-y) ( x < y )
看到這裡,有些人就覺得直接 n/2*(n-n/2) 就行了,既然你都分了n那你為什麼不再把n/2再分呢?
是的,這樣下去會分到n個1,乘積又變小了,所以我們就把n分成全部都是二,但n為奇數的時候會多出來乙個1,其實這時就可以把1與其中乙個2合併,成為3,畢竟我們知道 3 * x > 2 * x * 1 ( x > 0 )。
但仔細推敲就會發現乙個例外: 6
6 = 3+3 = 2+2+2,但是 3 * 3 > 2 * 2 * 2, 所以,當 n >= 6 時,(n-6) * 3 * 3 >= (n-6) * 2 * 2
同樣的,若(n-6)中還有6,說明還可以分。
我們再看,n<6的時候,按照前面乙個定理就可以了,但你還是會發現它們也遵循著先分3的原則,只不過在n%3==1的時候,拿出了乙個3與1組成了兩個2,因為我們知道 x * 3 * 1 < x * 2 * 2(x 為正整數)
所以總結一下吧
先分三,再分二,不分一;有一有三取成兩個二
所以,此題就變成了一道水題,qkp和高精就行了
**
#include
#include
#include
#include
using namespace std;
#define m
5005
int sum, n, len, len_3, ss;
int he[m]
, yin[m]
, ans[m]
;void
rd(int &x)
while
(isdigit
(c))
}void
qkp(int y)
;for
(int i =
1; i <= len; i ++)}
len += len_3;
while
(!linshi[len]
&& len >
0) len --
;for
(int i =
1; i <= len; i ++
) he[i]
= linshi[i];}
y /=2;
int linshi[m*
4]=;
for(int i =
1; i <= len_3; i ++)}
len_3 *=2;
len_3++
;while
(!linshi[len_3]
&& len_3 >
0) len_3 --
;for
(int i =
1; i <= len_3; i ++
) yin[i]
= linshi[i];}
} int main()
else
if( n%3==
1)else
sum = n/3;
qkp(sum)
;for
(int i =
1; i <= len; i ++)if
( ans[len+1]
) len++
;printf
("%d\n"
, len)
;for
(int i = len; i >=
max(
1,len-99)
; i --
)printf
("%d"
, ans[i]);
return0;
}
題目
給出乙個長度為n的整數序列,求出包含它的第k個元素的最長上公升子串行。
輸入第一行n與k
第二行n個元素
輸出如題目的所說的子串行的長度(0 < k <= n < 200000)
思路此題肯定不一般呀,樸素一定爆啊,所以沒學過最長上公升子串行優化方法的同學先補下課咩——點這裡哦
我們分兩段,1-k 和 k-n
1-k這段我們只要找到ak最後代替後所在的位置就行了
而如何搞k-n這一段呢?
如果我們單純從k-n,萬一這一段中有比ak小的,那麼這樣順著來的lis就可能不會含有ak,就會wa。
所以我們倒著來,這樣就和1-k這一段的方法一樣,那麼就會發現乙個問題,這樣倒著來是要搞乙個下降啊,那麼如何把大的變小,小的反而變大呢,其實很簡單,把它變為它的相反數,這樣我們就可以從n-k的順序來求n-k這一段的下降子串行,即為k-n的上公升子串行,因為算了兩次ak,所以需要減1
**
#include
#include
#include
#include
using namespace std;
#define m 200005
#define inf 0x3f3f3f3f
int n, k,
len, len1;
int a[m]
, dp[m]
, dp_[m];
void rd(
int&x)
while
( isdigit(c)
) x *= f;
}int main(
)for
(int i =
1; i <= k; i ++)
for(
int i = k; i <= n; i ++)
a[i]*=-
1;for(
int i = n; i >= k; i --)
printf(
"%d\n"
,len
+len1-1)
;return0;
}
1月24日考試 ftp密碼
錯因分析 對檔案的儲存不夠恰當,例如第一題和第三題的題目,我是真的很憤怒,第一題在我寫了乙個多小時,終於樣例成功.可是當我再一次開啟檔案時,裡面只有我最開始的 誰可以告訴我這是為什麼 我絕對儲存了,還試了樣例 還有第三題,也是莫名失蹤,那個躺拿35分的題,我也是0分,真是憤怒 對字串及其相應的應用掌...
3月13日考試
a.午餐費 題目描述 現要對某班學生進行n天培訓,該班所有學生都訂了n天的午餐,所以我們知道他們每天要花多少錢。現在該班班主任需要決定如何使用班費。由於錢有限,他們不可能每天都吃免費午餐。因此,每天班主任可以選擇自己支付或使用班費支付當天午餐費。當然,班主任比較小氣,希望盡可能多地花掉班費,但是他太...
2023年1月5日知識回顧
1 昨天研究了下七牛雲的上傳介面,比較易於呼叫,參考文件python sdk 2 研究了下vmaig blog的頭像上傳部分原始碼,但是部署到nginx有點兒問題,就是nginx處理靜態檔案,把所有靜態檔案都colllectstatic到了乙個指定的目錄,views的邏輯,關於儲存的路徑怎麼寫都沒對...