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