題意:有n個桌腿,要砍掉某些桌腿使得剩下的桌腿能支撐桌子。規定剩下的桌腿中長度最大的桌腿的數量如果超過一半即可支撐桌子。砍掉每個桌腿需要付出代價。求最小的代價和。
原題:
首先,按長度排序。
長度為p的桌腿有a[p]個。
要使得長度為p的桌腿為最長,
(1)將所有長於p的桌腿砍光
(2)那麼要按照代價從小到大砍掉sum-(a[p]-1)條腿。還需要列舉p即可。
#include #include #include #include using namespace std;
const int maxn = 1e5+4, inf = 0x7fffffff;
int ocur[maxn], allcost[maxn], sumocur[maxn], sumcost[maxn], barrel[204];
// ocur:每種長度的桌腿總數;
// allcost:每種長度的桌腿的代價總和;
// sumocur:桌腿出現次數的字首和;
// sumcost:桌腿代價總和的字首和;
// barrel:對代價的桶排序。
struct leg
} legs[maxn];
int main()
for(int i = 1; i <= n; i++)
sort(legs+1, legs+1+n);// 按桌腿長度進行排序。
int maxlen = legs[n].len;// 記錄桌腿最大長度,用於規定後續列舉的上界。(已排序)
for(int i = 1; i <= maxlen; i++)
int result = inf;
for(int i = 1; i <= n; i++)}}
result = min(result, tempres);//取代價小的
barrel[legs[i].cost]++;// 延遲新增當前桌腿的代價值,確保每次列舉代價時所檢查的代價值都屬於「長度小於等於當前桌腿」的桌腿的代價。
}cout << result << endl;
}return 0;
}
位元組跳動2019春招筆試第三題
具體題目不是很記得,大概如下 給出n個人,然後分別給出他們的成績 n個人成環狀 陣列首尾相連 每個人都至少有乙個獎牌 如果乙個人的成績比他左右兩人高,則他的獎牌要比其餘兩人多 求最少需要的獎牌 1.擴充套件陣列,首位相連 2.雙向遍歷,如果存在 分數比他後面的小,但是獎牌數比後面的大,調整後面的獎牌...
位元組跳動21春招第三場筆試演算法題
題目描述 動物園有猴山,每天需要給猴子們發香蕉,猴子會排隊依次取食。猴子們鋪張浪費,會多拿食物,但最多不會拿超過自身食量的二倍且不會超過當前還存在的香蕉的一半,最後乙個猴子除外 即最後乙個猴子可以拿完剩餘的所有香蕉 最少需要準備多少香蕉,能保證所有猴子都能吃飽?輸入描述 乙個陣列,每一項表示乙個猴子...
奇虎360 2017春招真題
1.分金子 a b兩夥馬賊意外地在一片沙漠中發現了一處金礦,雙方都想獨佔金礦,但各自的實力都不足以吞下對方,經過談判後,雙方同意用乙個公平的方式來處理這片金礦。處理的規則如下 他們把整個金礦分成n段,由a b開始輪流從最左端或最右端佔據一段,直到分完為止。馬賊a想提前知道他們能分到多少金子,因此請你...