貪心,優化(Sockets,cf 732e)

2021-07-23 20:29:23 字數 767 閱讀 7820

像這種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 的區間...