牛客 283F 出裝方案(最小費用最大流)

2021-09-01 22:55:37 字數 1719 閱讀 4480

題幹:

眾所周知,在各種對抗類遊戲裡裝備都是很重要的一環,不同的出裝方案會給玩家帶來不同的強度。

dalao手裡有n件裝備,現在dalao要把裝備分給n個隊友,每個隊友只能分一件裝備,而每個隊友穿上不同的裝備會有不同程度的強度提公升。

現在給出每個隊友對每件裝備的強度提公升的值,請問dalao的所有分配方案裡,最多能讓團隊的強度提公升多少呢?

第一行有乙個整數t,表示資料的組數(不會超過150組)

每組資料第一行包含乙個整數n,接下來會有n行,每行有n個整數,其中第 a 行的第 b 個數字表示第 a 個隊友穿上第 b 件裝備的強度提公升。任何隊員穿任何裝備的強度提公升都不會超過20000。

對於每組資料在一行內輸出乙個整數表示強度能夠提公升的最大值
示例1複製

2

41 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

31 3 5

2 4 6

7 9 11

複製

34

16

解題報告:

不難發現其實就是個二分最優匹配,可以選擇km演算法或者費用流來解決這個問題。

ac**:

#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

const int maxn = 70000;

const int maxm = 100005;

const int inf = 0x3f3f3f3f;

struct edge edge[maxm];

int head[maxn],tol;

int pre[maxn],dis[maxn];

bool vis[maxn];

int n;

void init(int n)

void addedge(int u,int v,int cap,int cost)

bool spfa(int s,int t)

dis[s] = 0;

vis[s] = true;

q.push(s);

while(!q.empty())

}} }

if(pre[t] ==-1)return false;

else return true;

}int mincostmaxflow(int s,int t,int &cost)

for(int i = pre[t]; i !=-1; i = pre[edge[i^1].to])

flow += min;

} return flow;

}int main()

} for(int i = 1; i<=n; i++) addedge(st,i,1,0);

for(int i = n+1; i<=2*n; i++) addedge(i,ed,1,0);

int cost;

int ans = mincostmaxflow(st,ed,cost);

printf("%d\n",-cost);

} return 0 ;

}

牛客 F日期小能手

題目鏈結 這道題,思路就是找到6.1,和5.1是週幾,然後再把日期加上去,想法是直接暴算,但是因為我又菜又懶,就放棄了這個題,後來補題的時候,看到大佬的 有公式可以計算某一天日期是週幾,並且,可以先進行預處理這樣更方便了,偷學了一手,確實,有奇效。這裡留一下大佬的 以便日後參考和學習 include...

牛客 283E 貪心只能過樣例(模擬)

題幹 小西是單身狗,所以她不喜歡看到有cp在秀恩愛!有一天,小西出來閒逛,發現街上的行人都排成了一排,並且可以用這種形式表示 mmfmmfffmmm 其中m表示男孩子,f表示 的男孩子 小西想讓所有的cp都消失!小西可以把任意一對 mf 或者 fm 趕走並變為乙個真正的小姐姐 j 例如上述的例子可以...

牛客練習賽58 F

求帶單點修改的樹上兩點間任意子路徑長異或和。路徑長等於路徑上所有異或和。簡單模擬一下,可以發現。奇數情況下,答案是偶數點異或和。偶數情況下,就是正常的異或和。偶數點異或和也很容易處理。分深度奇偶樹狀陣列即可。但是這是對於鏈的,不能直接dfs dfsdf s序,需要剖分一下。但是我不會,所以去學了一下...