BZOJ 1034 [ZJOI2008]泡泡堂BNB

题目传送门

第一眼以为是SB题,然后充分地发现了自己是SB这个事实。。

可能写得十分丑陋,还是说一下。。

因为会有平分,而且和赢的得分不一样,所以手算几组会发现很多比较玄学的情况。

正确的贪心策略: 把两个数组排序(我是从大到小)。若是我的头大于他的头,则我的ans+2,显然换其他人来赢也不会更优。

若我的尾大于他的尾,我的ans+2,同理任意换不会更优。  若我的头和我的尾都不能赢他了,若我的头和尾相等则直接比赛,

否则,说明我们队任何人都不能赢这个人,于是让我们队最弱的人输给这个人,这样以后 1我们队会一直输下去,无影响  2我的头能在后面赢一个本来不能赢的人,答案不会变劣(若都是打平则不变)。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
typedef long long LL;
using namespace std;
const int maxn=100000+299;
int n,a[maxn],b[maxn],wo,di,l,r,ql,qr,ans1,ans2;
bool cmp(int x,int y) {
    return x>y;
}
void solve(int a[],int b[]) {
    wo=0,di=0,l=1,r=n,ql=1,qr=n;
    while(l<=r) {
        if(l==r) {if(a[l]>b[ql]) wo+=2; else if(a[l]==b[ql]) wo++,di++; else di+=2; break;}
        if(a[l]>b[ql]) { wo+=2; l++; ql++;}
        else {
            if(a[r]>b[qr]) {
                wo+=2;
                r--; qr--;
            }
            else {
               if(a[l]==a[r]) {
                   if(a[l]==b[ql]) wo++,di++; else di+=2; l++,ql++;
                   if(a[r]==b[qr]) wo++,di++; else di+=2; r--,qr--;
               }
               else {

                   if(a[r]==b[l]) wo++,di++;
                   else if(a[r]<b[l]) di+=2;
                   r--; ql++;
               }
            }
        }
    }
}
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,cmp); sort(b+1,b+n+1,cmp);
    solve(a,b);  ans1=wo;
    solve(b,a);  ans2=di;
    printf("%d %d\n",ans1,ans2);
    return 0;
}
/*
6
1 4 5 7 9 11
2 3 5 9 10 21
*/

时间: 2024-10-13 12:19:28

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 【贪心】

题目链接:BZOJ - 1034 题目分析 这道题和田忌赛马的典故很相似. 先要将两队的队员都按照水平从小到大分别排序. 然后每次尝试用我方最弱的队员赢对方最弱的队员,或者用我方最强的队员赢对方最强的队员. 如果都不行,就用我方最弱的队员对抗对方最强的队员. 这样求出的就是我方的最高分. 由于进行 n 轮比赛之后,双方的比分和为 2n ,所以我方的最低分就是 2n - 对方的最高分. 代码 #include <iostream> #include <cstdlib> #includ

[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

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名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改.比赛中

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名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组委会提交一份参赛选手的名单,决定了选手上场的顺序,一经确定

bzoj1034: [ZJOI2008]泡泡堂BNB

田忌赛马. 原理:(假设a队最大得分,得分为res) 1.如果a最小 > b最小,res += 2. 这样没必要用更大的a来解决这个b. else 2.如果a最大 > b最小,res += 2. 这样没必要用更小的a解决这个b,这个b反正都要被解决,如果更小的a能解决这个b,那也能解决别的b. else 3.上述两种情况不成立,就用a最小消耗b最大,b最大没人能打过,就用最弱的,a最小打不过别人,就拿它凑数. 这里要注意一点如果a最小 == b最大,res += 1.(为什么请读者自己体会)