CV 为了报答 jjboom 邀请他去玩一个游戏。
游戏规则是:两人会随机拿到 n 张牌,两个人每次从里面抽一张比大小,点数则可以赢钱(1),反之则赔钱(1),一样则不亏不赚。
但CV在牌上做了手脚,可以知道对面都是什么牌和会出什么牌。CV最多可以赢多少钱?(就算这样也可能为负)
又多组数据,以 0 结尾
第一行:每人 n 张牌;
第二行:CV 的牌(n 个数据);
第三行:jjboom 的牌(n 个数据);
一行:最多赢多少钱。
2
12 11
12 2
6
13 1 12 2 1 1
13 4 13 5 4 12
0
1
-2
对于100%的数据 n<30000
先将双方的排排序,遍历 jjboom 的牌,如果我有比它高的牌则选高的牌中的最小的(因为前面排过序,所以发现一个就行),途中把第一个不是-1的点和第一个相等的点记录下来,如果没有高的找相等的,没有相等的找小的(即第一个不是-1的点),删除(改为-1),删除的是高的+1,是小的-1。
#include <bits/stdc++.h>
using namespace std;
int n;
int head,dd; // head:第一个不是-1的点 dd:第一个相等的点
int ans;
int cv[30000];
int jiboom[30000];
int main() {
while (true) {
ans = 0;
head = -1;
dd = -1;
scanf("%d",&n);
if (n==0) break;
for (int i=0;i<n;i++) scanf("%d",cv+i);
for (int i=0;i<n;i++) scanf("%d",jiboom+i);
sort(cv,cv+n);
sort(jiboom,jiboom+n);
for (int i=0;i<n;i++) {
for (int j=0;j<n;j++) {
if (head == -1 && cv[j] != -1) head = j;
if (cv[j] == jiboom[i] && cv[j] != -1) dd = j;
if (cv[j] > jiboom[i]) {
cv[j] = -1;
ans++;
break;
}
if (j+1 == n) {
if (dd != -1) cv[dd] = -1;
else {
cv[head] = -1;
ans--;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}