洛谷P2170 選學霸 並查集,揹包

2021-08-25 06:01:03 字數 1117 閱讀 9189

題目描述

老師想從n名學生中選m人當學霸,但有k對人實力相當,如果實力相當的人中,一部分被選上,另一部分沒有,同學們就會**。所以老師想請你幫他求出他該選多少學霸,才能既不讓同學們**,又與原來的m盡可能接近

輸入輸出格式

輸入格式:

第一行,三個正整數n,m,k。

第2…k行,每行2個數,表示一對實力相當的人的編號(編號為1…n)

輸出格式:

一行,表示既不讓同學們**,又與原來的m盡可能接近的選出學霸的數目。(如果有兩種方案與m的差的絕對值相等,選較小的一種:)

輸入輸出樣例

輸入樣例#1:

4 3 2

1 2

3 4輸出樣例#1:

2說明

100%的資料n,p<=20000

分析:先用並查集把相差不大的人合併,然後做一次揹包判斷就好了。

**

#include 

#define n 20005

using

namespace

std;

int f[n],dp[n],a[n],b[n],n,m,k;

int find(int x)

intabs(int x)

int main()

int cnt = 0;

for (int i = 1; i <= n; i++) f[i] = find(f[i]);

for (int i = 1; i <= n; i++) a[f[i]]++;

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

if (a[i]) b[++cnt] = a[i];

dp[0] = true;

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

for (int j = n; j >= b[i]; j--)

dp[j]|= dp[j - b[i]];

int ans = 0, min = 1e9;

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

if (dp[i] && abs(i - m) < min)

printf("%d", ans);

}

洛谷 P2170 選學霸

傳送門 在n nn個人中,有k kk對關係,要求選出m mm位學霸,且要保證所有關係相通的人都會一齊被選上 求滿足上述條件的情況下,最接近m mm的方案是選多少位學霸 因為題目要求我們將所有關係相通的人繫結在一起,所以我們考慮用並查集實現連通塊的判定 這就實現了將關係省去,在所有連通塊中選,我們可以...

洛谷 選學霸 並查集 揹包

題解 本題主要考查並查集 揹包變形 簡要題意 從n nn名學生中選m mm人當學霸,但有k kk對人實力相當。如果實力相當的人中,一部分被選上,另一部分沒有,同學們就會 求選出多少學霸合理,又與原來的m mm盡可能接近。1.並查集 揹包 巧妙的一題揹包,有k kk對人實力相當,那麼我們把實力相當的人...

洛谷p1525 並查集

先將最大的犯罪都找出來然後將人員分組 假設兩人x,y 如果x 前面已經有過敵人了 那就將y合併到x的敵人裡去 y也是如此若有 將x合併到y的敵人去 如果x 和 y前面都沒有 那麼互相將彼此設為敵人 直到找到矛盾的 就是 xy有同乙個敵人 include include include using n...