• [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
    ", Solve(A, B), 2 * n - Solve(B, A));
    	return 0;
    }
    

      

  • 相关阅读:
    python读写操作(txt, mat, xls, etc文件)
    开发linux版QQ就是支持未来的国产操作系统
    为知笔记linux绿色版的快速调用
    数学物理中的常见误区
    markdown语法小结
    信息爆炸时代的知识获取
    matlab: 数据的读写
    APS期刊投稿准备: REVTex格式
    markdown基本语法
    常见的数学关系
  • 原文地址:https://www.cnblogs.com/JoeFan/p/4321719.html
Copyright © 2020-2023  润新知