时间限制: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()