此題題目描述的很簡單,就是讓我們用有限的預算找到最小品質因子最大的電腦元件,並且每種元件必須都要買。這種求「最小值最大」的常用方法就是二分:若猜想的答案為
x x
,則取所有品質因子大於
x' role="presentation" style="position: relative;">x
x的元件進行組裝,如果能不超過預算,則說明正確答案
>=
x >=
x。因此,我們只需要列舉所有的品質因子,當第乙個不滿足題意的
x x
出現時,則解題結束。
但需要注意,此題有時間限制,因此必須使用二分法進行,時間複雜度為o(
lgn)
' role="presentation" style="position: relative;">o(l
gn)o
(lgn
)。此題涉及到type,name,price,quality,比較複雜,可使用map
進行hash,再給每個型別的元件乙個vector,price和quality使用結構體進行儲存。
需熟練使用map的各種函式。
在**中已經表明,如果去掉if(cheapest == budget)
這句話,則不能ac,顯示為wrong answer
,初步猜想是由於如果品質因子太大導致sum
太大超出了int表示範圍。
在**中進行二分查詢時,使用int middle = (right+left)/2
則顯示超時,為什麼?
可將質量因子先排好序,再用二分查詢進行列舉,可能會更快。
#include
#include
#include
using
namespace
std;
const
int maxn = 1000 + 10;
int cnt = 0;
int n; //預算和元件數目
int budget;
struct compont ;
std::vector
comp[maxn]; //每一項都是vector的陣列
std::map
id;
int convert(string type)
return id[type];
}//看品質不小於q的元件是否能在預算範圍內組裝
bool judge(int q)
sum += cheapest;
//若沒加這一句,則不能ac
if(cheapest == budget)
return
false;
if (sum > budget)
return
false;
}return
true;
}int main()
id.clear();
int maxq = 0;
for (int i = 0 ; i < n; i++));}
//使用二分法來加快速度
int left = 0,right = maxq;
while (left < right)
}cout
<< left << endl;
}return
0;}
歡迎關注我的個人部落格。 二分 最大的最小值
mad jim jaspers為了證明釹磁鐵的強大,拿來了乙個有n個小槽的長木條,m個釹磁鐵,第i個小槽在xi的位置上,為了不讓磁鐵互相吸引,每塊磁鐵離其他磁鐵的距離應該盡可能的大。請你幫mjj寫乙個程式,求出所有磁鐵之間最小距離的最大值。只要磁鐵距離大於等於1就不會互相吸引。輸入格式 第一行兩個數...
二分 最小值最大化
問題描述 記得上學那會,fbs同學經常會欺負蘿蔔同學。有一次,他出了這麼一道題目,想為難一下蘿蔔同學。題目是這樣的 有n個整數x i,x i值的範圍從0到1000000000。要從中選出c個數 2 c n 使得任意兩個數差的絕對值的最小值盡可能大,求這個最大值。由於資料太大,這次蘿蔔同學的確被難住了...
最大化最小值 二分
aggressive cows 題目意思 農民約翰有用c隻牛,然後他有n個隔間,每個隔間都有自己的座標位置 一維的 pos,如何安排把牛安排進隔間才能使,所有牛之間距離的最小值最大,我們不需要求這個分配方案,我們只需要求這個最小距離的最大值,很裸的最小值最大化。輸入 n 5m 3x 輸出 3 在位置...