題目描述
bf的生日快到了,這一次,小東決定為bf送乙份特別的生日禮物為其慶生。作為高智商中的佼佼者,bf在國外求學,因此小東無法與之一起慶生。小東計畫送乙個生日卡片,並通過特別的包裝讓bf永遠難忘。
她決定把卡片套裝在一系列的信封a = 中。小東已經從商店中購買了很多的信封,她希望能夠用手頭中盡可能多的信封包裝卡片。為防止卡片或信封被損壞,只有長寬較小的信封能夠裝入大些的信封,同尺寸的信封不能套裝,卡片和信封都不能摺疊。
輸入
輸入有若干組,每組的第一行包含三個整數n, w, h,1<=n<=5000, 1<=w, h<=10^6,分別表示小東手頭的信封數量和卡片的大小。緊隨其後的n行中,每行有兩個整數wi和hi,為第i個信封的大小,1<=wi, hi<=10^6。
輸出
對每組測試資料,結果第一行中輸出最多能夠使用的信封數量,結果第二行中按使用順序輸出信封的編號。由於小東有潔癖,她對排在前面的信封比較有好感,若有多個信封可用,她喜歡用最先拿到的信封。另外別忘了,小東要求把卡片裝入能夠裝的最小信封中。
如果卡片無法裝入任何信封中,則在單獨的行中輸出0。
思路
我看題時對題意有兩個疑惑,一是w和h的值可否交換,二是信封的大小判斷包不包括(w1==w2 && h1我整體的思路是使用動態規劃完成的,首先儲存了尺寸超過卡片的所有信封作為備選,選用map結構儲存,使所有信封依次按照w、h從小到大排序。依序遍歷每乙個備選信封,以當前信封a作為最後乙個信封,遍歷尺寸比它小的所有信封(因為前面所有的值都會影響當前的結果,所以都需要遍歷),計算出此時能夠套裝的信封總數的最大值,儲存最大值的情況下a的前乙個信封的索引號。
程式設計問題記錄
#include
#include
#include
using
namespace
std;
struct size
};int main()
mapint>select;
for (int i = 1; i <= num; i++)
if (wi>w && hi>h)
;if (select.find(env) == select.end())
select.insert(pairint>(env, i));}}
int packnum = select.size();
if (packnum > 0)}}
if (cnt == 0)cnt = 1;
maxnum[it->second] = cnt;
previd[it->second] = pid;
if ((cnt>maxnum[maxid]) || (cnt == maxnum[maxid] && it->second < maxid)) maxid = it->second;
}select.clear();
int id = maxid;
int count = 0;
while (id >= 0)
cout
<< count << endl;
delete previd;
delete maxnum;
previd = null;
maxnum = null;
if (count > 0)
cout
<< endl;}}
else
}return
0;}
生日禮物(京東2016實習生真題)
include include include include include include include include include include include include include include include include using namespace std ty...
單調 生日禮物
luogup2564 題目 小西有一條很長的彩帶,彩帶上掛著各式各樣的彩珠。已知彩珠有n個,分為k種。簡單的說,可以將彩帶考慮為x軸,每乙個彩珠有乙個對應的座標 即位置 某些座標上可以沒有彩珠,但多個彩珠也可以出現在同乙個位置上。小布生日快到了,於是小西打算剪一段彩帶送給小布。為了讓禮物彩帶足夠漂亮...
生日禮物(單調佇列)
小西有一條很長的彩帶,彩帶上掛著各式各樣的彩珠。已知彩珠有n個,分為k種。簡單的說,可以將彩帶考慮為x軸,每乙個彩珠有乙個對應的座標 即位置 某些座標上可以沒有彩珠,但多個彩珠也可以出現在同乙個位置上。小布生日快到了,於是小西打算剪一段彩帶送給小布。為了讓禮物彩帶足夠漂亮,小西希望這一段彩帶中能包含...