一道比較神奇的二分圖匹配
既然有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...