像這種o(n^2)匹配的問題一般可以用優先佇列,集合或者多重集合優化成o(nlogn)。
貪心的思路很簡單,先嘗試匹配,然後每個socket新增乙個adapter,繼續,重複31次。最多加三十次就變成1了。
這麼貪心為什麼對呢。
新增adapter後的socket匹配潛力肯定是減弱了的。這一輪無法匹配,加了adapter後就更難匹配了。因此不得已不加adapter。
我們又希望總的adapter最少,這也是能同時滿足的。
#include#define maxn 200010
using namespace std;
struct pc
friend bool operator< (const pc& a, const pc& b)
for(int i=1;i<=m;i++)
scanf("%d",&s[i]);
int sum=0;
int cnt=0;
for(int i=0;i<31;i++)
s[j]=(s[j]+1)>>1;}}
printf("%d %d\n",cnt,sum);
for(int i=1;i<=m;i++)
printf("%d ",adp[i]);
puts("");
for(int i=1;i<=n;i++)
printf("%d ",matchp[i]);
puts("");
return 0;
}
馬踏棋盤的貪心優化
資料結構上機時發現有乙個優化馬踏棋盤的方法。僅適用於優化求解乙個 或少數 對於求所有解時間不變。即dfs查詢路徑時優先選擇孫節點少的子節點。下面附上 include include include include using namespace std struct node int map 10 ...
題解 poj3190 貪心 堆優化
題目鏈結 按照開始吃草的時間把牛排序。用乙個小根堆維護每個畜欄最後一頭牛結束吃草的時間,嘗試把當前的牛安排在堆頂 include include include using namespace std define rep i,a,b for int i a i b i const int n 5e...
區間(貪心做法 線段樹優化)
題目 這道題目的話,按 r 從小到大排序,然後如果對於當前的區間沒有滿足至少 c i 個的話,就盡量選右邊的沒有選過的數字。顯而易見是正確的 正確性證明 對於當前這個區間 i 而言,如果前面 i 1 個區間已經是用了最少的數字,且盡量的把數字湊到 i 區間的 l 的的話,如果想要讓前 i 1 的區間...