发布于 

I

I'm Telling the Truth

hdu 3729

题目来源: hdu

分析

这题第一眼看上去或许不太像二分图匹配问题。但是我们仔细研究一下便可以发现,我们可以把学生和分数当作二分图的两个部分,因为分数小于\(100000\),所以我们可以直接开一个数组存储它的belong[]。然后就二分图匹配,找到匹配的数量,便是我们要的"说真话的学生数量"。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <cstring>

using namespace std;

bool flag[100100];
int l[100],r[100];
int belong[100100];
int ans[100];

bool find(int x)
{
for (int i = l[x]; i<=r[x]; i++)
if (!flag[i])
{
flag[i] = true;
if (belong[i]==0 || find(belong[i]))
{
belong[i] = x;
return true;
}
}
return false;
}

int main()
{
int T;
cin >> T;
while (T--)
{
memset(belong,0,sizeof(belong));

int n;
cin >> n;
for (int i = 1; i<=n; i++)
cin >> l[i] >> r[i];

int cnt = 0;
for (int i = n; i>0; i--)
{
memset(flag,false,sizeof(flag));
if (find(i))
ans[++cnt] = i;
}

cout << cnt << endl;
for (int i = cnt; i>1; i--)
cout << ans[i] << " ";
cout << ans[1] << endl;
}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 [@Songer](https://blog.songer.xyz/) 创建,使用 Stellar 作为主题。