站外题求助
  • 板块学术版
  • 楼主tianxun
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/5/13 22:17
  • 上次更新2023/10/23 15:50:45
查看原帖
站外题求助
848904
tianxun楼主2023/5/13 22:17

题面

CV 为了报答 jjboom 邀请他去玩一个游戏。

游戏规则是:两人会随机拿到 nn 张牌,两个人每次从里面抽一张比大小,点数则可以赢钱(1),反之则赔钱(1),一样则不亏不赚。

但CV在牌上做了手脚,可以知道对面都是什么牌和会出什么牌。CV最多可以赢多少钱?(就算这样也可能为负)

输入

又多组数据,以 00 结尾

第一行:每人 nn 张牌;

第二行:CV 的牌(nn 个数据);

第三行:jjboom 的牌(nn 个数据);

输出

一行:最多赢多少钱。

案例

输入案例1

2
12 11 
12 2 
6
13 1 12 2 1 1 
13 4 13 5 4 12 
0

输出案例1

1
-2

数据范围

对于100%的数据 n<30000n < 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;
}
2023/5/13 22:17
加载中...