返回目录
题目描述
给定两个只包含数字的数组a,b,调整数组 a 里面的数字的顺序,使得尽可能多的a[i] > b[i]。
数组a和b中的数字各不相同。
输出所有可以达到最优结果的a数组的结果。
输入描述
输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a数组大小不超过10。
输入的第二行是数组 b 中的数字,其中只包含数字,每两个数字之间相隔一个空格,b数组大小不超过10。
输出描述
输出所有可以达到最优结果的 a 数组的数量。
示例:
输入 | 11 8 20 10 12 7 |
---|---|
输出 | 1 |
说明 | 最优结果只有一个,a = [11, 20, 8],故输出1 |
题目解析
本题数量级不大,可以考虑暴力破解。即求解a数组的所有全排列,然后将a数组的每个全排列和b数组逐个元素进行比较,统计每个全排列中a[i] > b[i]的个数biggerCount。我们保留最大的biggerCount 为 maxBiggerCount。
最终统计的是a[i] > b[i]的个数为maxBiggerCount的全排列的数量。
Python算法源码
def dfs(level, used, bigger_count):
global max_bigger_count, ans
if level >= len(a):
# 到达递归终点,统计当前排列中a中大于b的个数,并更新最大个数和方案数量
if bigger_count > max_bigger_count:
max_bigger_count = bigger_count
ans = 1
elif bigger_count == max_bigger_count:
ans += 1
return
for i in range(len(a)):
if used[i]:
continue
# 去除同一层重复情况
if i > 0 and a[i] == a[i - 1] and not used[i - 1]:
continue
used[i] = True
# 递归搜索
dfs(level + 1, used, bigger_count + (1 if a[i] > b[level] else 0))
used[i] = False
if __name__ == "__main__":
# 输入a和b的数组
a = list(map(int, input().split()))
b = list(map(int, input().split()))
# 对a数组排序
a.sort()
max_bigger_count = 0
ans = 0
# 调用深度优先搜索函数
dfs(0, [False] * len(a), 0)
# 输出结果
print(ans)
C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 10
int a[MAX_SIZE];
int b[MAX_SIZE];
int a_size = 0;
int b_size = 0;
int maxBiggerCount = 0;
int ans = 0;
// 深度优先搜索函数
void dfs(int level, bool used[], int biggerCount);
// 冒泡排序
void sort(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 初始化输入数组
void initializeArrays() {
char temp;
while (scanf("%d", &a[a_size++])) {
if ((temp = getchar()) != ' ') break;
}
while (scanf("%d", &b[b_size++])) {
if ((temp = getchar()) != ' ') break;
}
}
// 深度优先搜索函数
void dfs(int level, bool used[], int biggerCount) {
if (level >= a_size) {
// 到达叶子节点,更新答案
if (biggerCount > maxBiggerCount) {
maxBiggerCount = biggerCount;
ans = 1;
} else if (biggerCount == maxBiggerCount) {
ans += 1;
}
return;
}
for (int i = 0; i < a_size; i++) {
if (used[i]) continue;
// 树层去重
if (i > 0 && a[i] == a[i - 1] && !used[i - 1]) continue;
used[i] = true;
// 继续搜索下一层
dfs(level + 1, used, biggerCount + (a[i] > b[level] ? 1 : 0));
used[i] = false;
}
}
int main() {
initializeArrays();
// 对数组a进行排序
sort(a, a_size);
bool used[MAX_SIZE] = {false};
// 开始深度优先搜索
dfs(0, used, 0);
printf("%d\n", ans);
return 0;
}
Java算法源码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[] a; // 数组a
static int[] b; // 数组b
static int maxBiggerCount = 0; // 记录当前最大的biggerCount
static int ans = 0; // 答案计数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取输入数组a
a = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 读取输入数组b
b = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 对数组a进行排序
Arrays.sort(a);
// 调用深度优先搜索函数
dfs(0, new boolean[a.length], 0);
// 输出答案
System.out.println(ans);
}
// 深度优先搜索函数
public static void dfs(int level, boolean[] used, int biggerCount) {
if (level >= a.length) {
// 到达叶子节点,更新答案
if (biggerCount > maxBiggerCount) {
maxBiggerCount = biggerCount;
ans = 1;
} else if (biggerCount == maxBiggerCount) {
ans++;
}
return;
}
for (int i = 0; i < a.length; i++) {
if (used[i]) continue; // 已经被使用过的元素跳过
// 树层去重
if (i > 0 && a[i] == a[i - 1] && !used[i - 1]) continue;
used[i] = true; // 标记当前元素被使用
// 继续搜索下一层
dfs(level + 1, used, biggerCount + (a[i] > b[level] ? 1 : 0));
used[i] = false; // 恢复当前元素为未使用状态
}
}
}
3 条评论
代码运行之后,好像不太对
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]