傳送門
大意是給一些零件(屬性:種類,名稱(沒用),加格,品質),電腦的品質取決於最低的配件品質,問有的錢能買的最高的電腦品質。這裡是o( n^2 * logn * t)的演算法。這個題一看就是二分,o(n^2 * logn * t)的演算法也很好想,就是排序之後二分下標,貪心可check。字串的話,我使用的是類似離散的方法編號而避免了用map,因為map+string會很慢(但是string還是很慢),雖然實際上複雜度遠小於上界,但是n=1000時o(n^2 * logn * t)=10^9,感覺複雜度太高了。我想到一種解法是o(n * (logn)^2 * t)可是老是寫不對,因為我就是個大蒟蒻。我想的是先對品質也離散化,將品質作為權值,插入到權值線段樹中(這樣會建n棵樹,不過總時間複雜度仍然是o(nlogn)),然後這個位置放它的cost,二分的時候直接在權值線段樹上query,log的時間就能得到最小的cost了。
再回顧一下,
t組資料 t
|——(型別離散 )nlogn + (品質離散) nlogn +(建樹一共) nlogn
|——(二分,注意去二分下標而不是二分答案,二分答案是log1e9的) logn
|———–(列舉型別,對於每個型別query一次) nlogn
這樣差不多就是o(t * n * (logn) ^ 2 )的了,但是由於本人太弱未能將其實現,若有實現者請一定告訴我(這種方法跑的快不快qwq)。
//qwsin
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=1000+10;
const
int inf=(1
<<30);
struct node
node(int k,int c,int q):kind(k),cost(c),qua(q){}
}a[maxn];
vector
v[maxn];
int n,v,qua[maxn];
string tmp[maxn],s[maxn];
inline
int read()
inline
int check(int ans,int k)
return1;}
void solve()
sort(tmp+1,tmp+n+1);
int k=unique(tmp+1,tmp+n+1)-tmp-1;
for(int i=1;i<=n;i++) a[i].kind=lower_bound(tmp+1,tmp+k+1,s[i])-tmp;
for(int i=1;i<=n;i++) v[a[i].kind].push_back(a[i]);
sort(qua+1,qua+n+1);
int l=1,r=n,ans;
while(l<=r)
printf("%d\n",ans);
}int main()
Assemble 組裝電腦,LA 3971
你有b塊錢,想要組裝一台電腦。給出n個配件各自的種類 品質因子和 要求每種型別的配件各買乙個,總 不超過b,且品質最差的配件的品質因子應盡量大。1.考慮暴力解法 將n個配件分成m類,每一類選乙個品質因子不小於q的 最低的配件。如果總 不超過b,則品質因子q滿足條件。而要使品質因子盡量大,則從小到大列...
LA3971 組裝電腦 二分答案
演算法競賽入門經典 訓練指南 第28頁,例題12 注意二分的時候m l r 1 2,二分法為了避免死迴圈,根據情況m l r 2 m l r 1 2 題解對輸入的多個字串編號採用了map 的寫法以後可以借鑑下 題解就是假設最小的品質因子是x,則刪除所有品質因子小於x的配件,然後判斷剩下配件能否組裝出...
組裝電腦 LA 3971 二分答案
題目 給定電腦的n n 1000 個配件,每個配件有型別,名字 沒用的資訊 和品質因子。要求每種型別的配件各買乙個用於組裝電腦,總 不超過b元。求所有可能的方案中品質因子最差的那個配件的品質因子最大能是多少。分析 看著這資料,覺得暴力也可做,列舉每個品質因子,找出滿足要求的最大的。但如果資料大一點,...