藍橋杯 演算法訓練 Pyramids 動態規劃

2021-10-03 11:24:38 字數 2286 閱讀 3308

資源限制

時間限制:7.0s 記憶體限制:512.0mb

問題描述

1.所有石塊都必須用上;

2.金字塔數要盡可能少;

3.所有金字塔兩兩不同;

4.金字塔至少包含兩層,即底座為1的金字塔和底座為2的矮金字塔是不允許的;

5.滿足以上4點的基礎上,最大的金字塔要盡可能大(大定義為用的石塊數多);

6.滿足以上5點的基礎上,次大的金字塔要盡可能大;

7.以此類推。。

你能求出最好的搭金字塔方案麼?或者告訴法老這是做不到的。

輸入格式

輸入僅包含一行,乙個正整數n(n<=10^6),表示你擁有的石塊數量。

輸出格式

輸出需要給出具體的方案,或者告訴法老不可能辦到。具體的,如果不能辦到,輸出impossible否則輸出每個金字塔如何搭建,格式是「底座長度+h/l」,h表示這是一座高金字塔,l表示矮金字塔。多座金字塔按從大到小排序輸出,如果大小一樣,先輸出「高金字塔」。兩座金字塔間用恰好乙個空格隔開。

樣例輸入

樣例輸出

3h 3l 2h

資料規模和約定對於20%的資料,n<=20

對於50%的資料,n<=1000

對於100%的資料,n<=1000000

?恨不得鯊了這法老

這題其實有點像用一堆數字湊乙個整數

狀態轉移:

假如有n塊石頭,我們從能搭建的最大的金字塔開始,從大到小列舉金字塔,假設第i個金字塔需要的石塊數目為x,那麼問題轉為:

【使用n-x塊石頭建造最少的金字塔】+ 【使用x塊石頭造一座金字塔】

初始狀態:

如果給的石頭數目剛好能造一座某型號的金字塔,那麼答案就是造一座

使用雙指標,從大到小在高矮金字塔所需的陣列中一一遍歷,找到乙個合適的型號,使得使用n-x塊石頭造金字塔,塔數目最少

**注釋詳細

#include

using

namespace std;

// 定義結構p,num表示金字塔的個數,str是答案

// num=0 表示無解

typedef

struct pp(

int n, string s)

:num

(n),

str(s)

} p;

#define maxlen 200

int hi[maxlen]

;// hi[i]表示底座長i的高金字塔需要磚塊數

int lo[maxlen]

;// lo[i]表示底座長i的矮金字塔需要磚塊數

p dp[

1000009];

// dp[i]表示有i塊磚的方案,用p結構儲存

// int轉string

string int2str

(int s)

reverse

(ans.

begin()

, ans.

end())

;return ans;

}int

main()

else

}// 乙個指標走到頭,走另乙個

if(i1<

2&& i2>=3)

}else

if(i1>=

2&& i2<3)

}// 如果真的找不到解,這個i值無解

if(ans.num==int_max) dp[i]=p

(0,""

);else dp[i]

=ans;}if

(dp[n]

.num==

0) cout<<

"impossible"

<

else cout<

.str<

return0;

}

藍橋杯 演算法訓練 Lift and Throw

演算法訓練 lift and throw 時間限制 3.0s 記憶體限制 256.0mb 問題描述 給定一條標有整點 1,2,3,的射線.定義兩個點之間的距離為其下標之差的絕對值.laharl,etna,flonne一開始在這條射線上不同的三個點,他們希望其中某個人能夠到達下標最大的點.每個角色只能...

藍橋杯 演算法訓練 數列

題目 演算法訓練 數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上就是 3 0,31,3 0 31,3 2,...

藍橋杯 演算法訓練 Glenbow Museum

資料規模和約定 按題目描述所示。問題描述 卡城著名的格林堡博物館是加拿大西部最大的博物館,展品涵蓋了藝術 文化史以及礦物學。如今乙個全新的展區正在被布置,它是專門為你這樣傑出的程式猿 媛 打造的。不幸的是,由於空間不足,博物館打算建造一棟新的建築來重新安置這個展區。新的建築的尺寸和容量將不同於原始的...