bluecode-2023B-数字序列比大小

169 阅读4分钟

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 128MB,其他语言 256MB
难度:困难

描述

A,B两个人玩一个数字比大小的游戏,在游戏前,两个人会拿到相同长度的两个数字序列,两个数字序列不相同的,且其中的数字是随机的。 

A,B各自从数字序列中挑选出一个数字进行大小比较,赢的人得1分,输的人扣1分,相等则各自的分数不变。 

用过的数字需要丢弃。 求A可能赢B的最大分数。

输入描述

输入数据的第1个数字表示数字序列的长度N,后面紧跟着两个长度为N的数字序列。

输出描述

A可能赢B的最大分数

用例输入 1 **

3
4 8 10
3 6 4

用例输出 1 **

3
#include <iostream>
#include <vector>
#include <algorithm>

int result(int n, std::vector<int>& a, std::vector<int>& b) {
    // 对两个数组进行排序
    std::sort(a.begin(), a.end());
    std::sort(b.begin(), b.end());

    int la = 0;      // 指向田忌最慢的马
    int ra = n - 1; // 指向田忌最快的马
    int lb = 0;      // 指向齐王最慢的马
    int rb = n - 1; // 指向齐王最快的马
    int ans = 0;     // 结果

    while (la <= ra) {
        if (a[ra] > b[rb]) {
            // 田忌最快的马 比 齐王最快的马要快, 则直接比
            ans += 1;
            ra -= 1;
            rb -= 1;
        } else if (a[ra] < b[rb]) {
            // 田忌最快的马 比 齐王最快的马要慢, 则结果肯定输, 用田忌最慢的马去消耗齐王最快的马
            ans -= 1;
            la += 1;
            rb -= 1;
        } else {
            // 田忌最快的马 和 齐王最快的马速度相同
            if (a[la] > b[lb]) {
                // 田忌最慢的马 比 齐王最慢的马 快, 直接比
                ans += 1;
                la += 1;
                lb += 1;
            } else {
                // 田忌最慢的马 比 齐王最慢的马 慢或相等
                if (b[rb] > a[la]) {
                    ans -= 1; // 田忌最慢的马输给齐王最快的马
                }
                la += 1;
                rb -= 1;
            }
        }
    }

    return ans;
}

int main() {
    int n;
    std::cin >> n;

    std::vector<int> a(n);
    std::vector<int> b(n);

    for (int i = 0; i < n; ++i) {
        std::cin >> a[i];
    }

    for (int i = 0; i < n; ++i) {
        std::cin >> b[i];
    }

    int res = result(n, a, b);
    std::cout << res << std::endl;

    return 0;
}
package main

import (
	"fmt"
	"sort"
)

func result(n int, a []int, b []int) int {
	// 对两个切片进行排序
	sort.Ints(a)
	sort.Ints(b)

	la := 0      // 指向田忌最慢的马
	ra := n - 1 // 指向田忌最快的马
	lb := 0      // 指向齐王最慢的马
	rb := n - 1 // 指向齐王最快的马
	ans := 0     // 结果

	for la <= ra {
		if a[ra] > b[rb] {
			// 田忌最快的马 比 齐王最快的马要快, 则直接比
			ans += 1
			ra -= 1
			rb -= 1
		} else if a[ra] < b[rb] {
			// 田忌最快的马 比 齐王最快的马要慢, 则结果肯定输, 用田忌最慢的马去消耗齐王最快的马
			ans -= 1
			la += 1
			rb -= 1
		} else {
			// 田忌最快的马 和 齐王最快的马速度相同
			if a[la] > b[lb] {
				// 田忌最慢的马 比 齐王最慢的马 快, 直接比
				ans += 1
				la += 1
				lb += 1
			} else {
				// 田忌最慢的马 比 齐王最慢的马 慢或相等
				if b[rb] > a[la] {
					ans -= 1 // 田忌最慢的马输给齐王最快的马
				}
				la += 1
				rb -= 1
			}
		}
	}

	return ans
}

func main() {
	var n int
	fmt.Scan(&n)

	a := make([]int, n)
	b := make([]int, n)

	for i := 0; i < n; i++ {
		fmt.Scan(&a[i])
	}

	for i := 0; i < n; i++ {
		fmt.Scan(&b[i])
	}

	res := result(n, a, b)
	fmt.Println(res)
}
def result(n, a, b):
    # 对两个列表进行排序
    a.sort()
    b.sort()

    la = 0      # 指向田忌最慢的马
    ra = n - 1  # 指向田忌最快的马
    lb = 0      # 指向齐王最慢的马
    rb = n - 1  # 指向齐王最快的马
    ans = 0     # 结果

    while la <= ra:
        if a[ra] > b[rb]:
            # 田忌最快的马 比 齐王最快的马要快, 则直接比
            ans += 1
            ra -= 1
            rb -= 1
        elif a[ra] < b[rb]:
            # 田忌最快的马 比 齐王最快的马要慢, 则结果肯定输, 用田忌最慢的马去消耗齐王最快的马
            ans -= 1
            la += 1
            rb -= 1
        else:
            # 田忌最快的马 和 齐王最快的马速度相同
            if a[la] > b[lb]:
                # 田忌最慢的马 比 齐王最慢的马 快, 直接比
                ans += 1
                la += 1
                lb += 1
            else:
                # 田忌最慢的马 比 齐王最慢的马 慢或相等
                if b[rb] > a[la]:
                    ans -= 1  # 田忌最慢的马输给齐王最快的马
                la += 1
                rb -= 1

    return ans

def main():
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))

    res = result(n, a, b)
    print(res)

if __name__ == "__main__":
    main()