[BZOJ 1034] [ZJOI2008] 泡泡堂BNB 【贪心】

题目链接:BZOJ - 1034

题目分析

这道题和田忌赛马的典故很相似。

先要将两队的队员都按照水平从小到大分别排序。

然后每次尝试用我方最弱的队员赢对方最弱的队员,或者用我方最强的队员赢对方最强的队员。

如果都不行,就用我方最弱的队员对抗对方最强的队员。

这样求出的就是我方的最高分。

由于进行 n 轮比赛之后,双方的比分和为 2n ,所以我方的最低分就是 2n - 对方的最高分。

代码

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

const int MaxN = 100000 + 5;

int n, Min, Max, Ans;
int A[MaxN], B[MaxN];

inline void Cmp(int x, int y)
{
	if (x > y) Ans += 2;
	if (x == y) Ans += 1;
}

int Solve(int *A, int *B)
{
	Ans = 0;
	int l1, r1, l2, r2;
	l1 = l2 = 1;
	r1 = r2 = n;
	while (l1 <= r1)
	{
		if (A[l1] > B[l2]) Cmp(A[l1++], B[l2++]);
		else if (A[r1] > B[r2]) Cmp(A[r1--], B[r2--]);
		else Cmp(A[l1++], B[r2--]);
	}
	return Ans;
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);
	for (int i = 1; i <= n; ++i) scanf("%d", &B[i]);
	sort(A + 1, A + n + 1);
	sort(B + 1, B + n + 1);
	printf("%d %d\n", Solve(A, B), 2 * n - Solve(B, A));
	return 0;
}

  

时间: 2024-11-08 08:21:44

[BZOJ 1034] [ZJOI2008] 泡泡堂BNB 【贪心】的相关文章

BZOJ 1034: [ZJOI2008]泡泡堂BNB( 贪心 )

贪心...用最弱的赢最弱的,用最强的赢最强的,否则用最弱的和最强的比... (贴个官方题解:将双方的选手均按从强到弱排序,然后第一次扫描尽可能用当前剩下的选手中能赢对手当前最强选手中最弱的一个去赢得胜利,若无法做到,则暂时不考虑给对方最强的选手匹配对手.第二遍扫描使用同样策略去获取尽量多的平局.最后剩下的选手任意匹配就能获得最多的分数) -------------------------------------------------------------------- #include<cs

bzoj 1034: [ZJOI2008]泡泡堂BNB 貪心

1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1398  Solved: 727[Submit][Status] Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改.比赛中

[BZOJ 1034][ZJOI2008]泡泡堂BNB(类田忌赛马贪心)

http://www.lydsy.com:808/JudgeOnline/problem.php?id=1034 我会说这就是改版POJ的那道Tianji the horse racing么... 不过这个题的游戏规则略有些不同,赢了得2分,平了得1分,输了不扣分,所以贪心过程和POJ的那题略有一点不同,具体看代码吧. #include <iostream> #include <stdio.h> #include <stdlib.h> #include <stri

bzoj 1034 [ZJOI2008]泡泡堂BNB(贪心)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1034 [题意] 给两个序列以任意顺序比较,求出最大和最小得分. [思路] 排序后使用贪心. 最小的能赢就赢,最大的能赢就赢,否则用最小的比最大的. [代码] 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using names

BZOJ 1034 [ZJOI2008]泡泡堂BNB

题目传送门 第一眼以为是SB题,然后充分地发现了自己是SB这个事实.. 可能写得十分丑陋,还是说一下.. 因为会有平分,而且和赢的得分不一样,所以手算几组会发现很多比较玄学的情况. 正确的贪心策略: 把两个数组排序(我是从大到小).若是我的头大于他的头,则我的ans+2,显然换其他人来赢也不会更优. 若我的尾大于他的尾,我的ans+2,同理任意换不会更优.  若我的头和我的尾都不能赢他了,若我的头和尾相等则直接比赛, 否则,说明我们队任何人都不能赢这个人,于是让我们队最弱的人输给这个人,这样以后

BZOJ [ZJOI2008]泡泡堂BNB 贪心

[ZJOI2008]泡泡堂BNB Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1034 Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定

1034: [ZJOI2008]泡泡堂BNB

题目描述: 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改.比赛中,双方的一号选手,二号选手--,n号选手捉对厮杀,共进行n场比赛.每胜一场比赛得2分,平一场得1分,输一场不得分.最终将双方的单场得分相加得出总分,总分高的队伍晋级(总分相同抽签决定).作为浙江队的领队,你已经在事先将各省

ZJOI2008泡泡堂BNB

1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1305  Solved: 676[Submit][Status] Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改.比赛中

[luoguP2587] [ZJOI2008]泡泡堂(贪心)

传送门 贪心,很像田忌赛马那样,但是因为有平局加一分导致那样的贪心不好处理. 先将两个数组从小到大排序. 比较a最大和b最大,如果a比b大,那么直接赢掉 否则 比较a最小和b最小,如果a比b大,那么直接赢掉 否则 比较a最小和b最大,如果相等,那么平局,否则就输掉 #include <cstdio> #include <iostream> #include <algorithm> #define N 100010 using namespace std; int n,