51nod 1164 最高的獎勵 V2

2022-05-08 03:54:09 字數 1347 閱讀 8414

一道比較神奇的二分圖匹配

既然有n個元素,那麼能匹配n個位置,我們把這n個位置找出來,是每個區間從左端點開始找到乙個沒有被匹配到的位置作為該點(我們忽略右端點)

然後我們從價值大到小,然後從左端點的位置開始匹配,如果這個點沒有被匹配,就匹配這個點

否則如果這個點已經匹配的區間右端點大於該點的右端點,就用matk[y]去匹配y + 1,否則就用x取匹配y + 1

#include #include #include #include #include #include #include #include #include #define enter putchar('\n')

#define space putchar(' ')

//#define ivorysi

#define pb push_back

#define mo 974711

#define pii pair#define mp make_pair

#define fi first

#define se second

#define maxn 500005

#define eps 1e-12

using namespace std;

typedef long long int64;

typedef double db;

templatevoid read(t &res)

while(c >= '0' && c <= '9')

res = res * f;

}templatevoid out(t x)

if(x >= 10) out(x / 10);

putchar('0' + x % 10);

}int n,pos[5005];

int matk[5005];

struct seg s[5005];

bool cmpw(seg a,seg b)

bool cmps(seg a,seg b)

bool match(int x,int y)

if(s[matk[y]].t <= s[x].t)

}else

}return 0;

}void solve() ;

}sort(s + 1,s + n + 1,cmps);

for(int i = 1 ; i <= n ; ++i)

sort(s + 1,s + n + 1,cmpw);

int64 ans = 0;

for(int i = 1 ; i <= n ; ++i)

out(ans);enter;

}int main()

51 nod 最高的獎勵

有n個任務,每個任務有乙個最晚結束時間以及乙個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每乙個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有衝突,這需要你來取捨。求能夠獲得的最高獎勵。input 第1行 乙個數n,表示任務的數量 2 n 500...

51Nod 1163 最高的獎勵

acm模版 這是一道十分不錯的貪心問題,有o nlogn 和o n n 解法。oneo nlogn 演算法 將最晚結束時間公升序排序,第n個任務最晚時間如果大於已經消耗的時間,則可以算入總和,若不大於可以嘗試替換掉已經算入總和中的最小獎勵的任務,條件是這件任務的獎勵要大於要替換掉的任務的獎勵。使用優...

51NOD 1163 最高的獎勵

這個題 自己想了想 mmp 感覺一做貪心題只會用 sort 忽略了 優先佇列 這題搜了題解後 大概明白了 就是建立乙個最小堆 把cost 壓入最小堆 如果當前時間 q.size 說明可以直接加 如果小於等於 就要把cost 壓入後 取乙個最小的出來 挺好的乙個題 include using name...