舞会配对

题目大意:在 NOI2015 闭幕式舞会上有 N 个男孩和 N 个女孩,每个人都量过了自己的身高。每个男孩只跟女孩跳舞,并且女孩也只跟男孩跳舞。每个人最多只有一个舞伴。男孩或者想和比自己高的女孩跳舞,或者想和比自己低的女孩跳舞,同样的,女孩也是或者想和比自己高的男孩跳舞,或者想和自己低的男孩跳舞。你能决定最多有多少对能在一起跳舞么?

正解很简单,四类人两两搭配,一个显然正确且合理的贪心:对于一个人,如果有多种选择,选择最矮的那个一定更优,双指针维护一下就好

跟着豪哥学细节:c[cntc + 1] = inf

代码如下:

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
#define int long long
using namespace std;

const int N = 1e5 + 66, inf = 2147483647;

int a[N], b[N], c[N], d[N];
int cnta, cntb, cntc, cntd;

inline bool cmp(int x, int y){return x > y;}

signed main()
{
int i, x, y, res(0), n = read();
for (i = 1; i <= n; ++ i)
{
x = read(), y = abs(x);
if (x == y) a[++ cnta] = y;
else b[++ cntb] = y;
}
for (i = 1; i <= n; ++ i)
{
x = read(), y = abs(x);
if (x == y) c[++ cntc] = y;
else d[++ cntd] = y;
}

sort(a + 1, a + 1 + cnta), sort(d + 1, d + 1 + cntd);

int l = 1;
for (i = 1; i <= cnta; ++ i)
{
if (l > cntd) break;
while (l <= cntd && d[l] <= a[i]) ++ l;
if (a[i] < d[l]) ++ res, ++ l;
}

sort(b + 1, b + 1 + cntb, cmp), sort(c + 1, c + 1 + cntc, cmp);

l = 1;
c[cntc + 1] = inf;
for (i = 1; i <= cntb; ++ i)
{
if (l > cntc) break;
while (l <= cntc && c[l] >= b[i]) ++ l;
if (b[i] > c[l]) ++ res, ++ l;
}

put(res);
return 0;
}

总结:

考试时候一开始就想写暴力,然后写了二分图,因为距离上一次写板子已经过去三个月了,所以这次写板子还调了一会,一开始还建了个双向边….导致写暴力就花了1h没时间想正解,或者说想到了,没时间也没赶写

本质上,还是对板子不够熟练,知识点有盲区,我假如可以半小时写完暴力,再搭配上最后的二十分钟,就总计可以有五十分钟的时间来写正解

可惜,那是假如

期望得分:100+50+?pts

实际得分:90+40+30pts

在稳步提升,不是我变强了,也不是他们变菜了(他们一直都很菜),是我的做题策略改变了,终于不再傻逼兮兮的上来就猛干正解,最后正解没肝出来,暴力也没打上

以后在保证暴力正确性的前提下,缩短暴力时间,正解还是要写的

我想AK

虎瘦雄心在,人穷志不短,无论落魄到何种地步,都不要触碰做人的底线,心怀勇气的走下去,只有这样,一切才会好起来