(C卷,200分)- 田忌赛马(Java & JS & Python & C)

题目描述

给定两个只包含数字的数组a,b,调整数组 a 里面的数字的顺序,使得尽可能多的a[i] > b[i]。

数组a和b中的数字各不相同。

输出所有可以达到最优结果的a数组的结果。

输入描述

输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a数组大小不超过10。

输入的第二行是数组 b 中的数字,其中只包含数字,每两个数字之间相隔一个空格,b数组大小不超过10。

输出描述

输出所有可以达到最优结果的 a 数组的数量。

用例

输入 11 8 20
10 13 7
输出 1
说明 最优结果只有一个,a = [11, 20, 8],故输出1
输入 11 12 20
10 13 7
输出 2
说明 有两个a数组的排列可以达到最优结果,[12, 20, 11] 和 [11, 20, 12],故输出2
输入 1 2 3
4 5 6
输出 6
说明 a无论如何都会全输,故a任意排列都行,输出所有a数组的排列,6种排法。

题目解析

本题数量级不大,可以考虑暴力破解。即求解a数组的所有全排列,然后将a数组的每个全排列和b数组逐个元素进行比较,统计每个全排列中a[i] > b[i]的个数biggerCount。我们保留最大的biggerCount 为 maxBiggerCount。

最终统计的是a[i] > b[i]的个数为maxBiggerCount的全排列的数量。

关于全排列的求解,可以参考:

本题不需要我们输出具体排列,因此不用定义path记录全排列。

JS算法源码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const a = (await readline()).split(" ").map(Number);
  const b = (await readline()).split(" ").map(Number);

  let maxBiggerCount = 0;
  let ans = 0;

  function dfs(level, used, biggerCount) {
    if (level >= a.length) {
      if (biggerCount > maxBiggerCount) {
        maxBiggerCount = biggerCount;
        ans = 1;
      } else if (biggerCount == maxBiggerCount) {
        ans += 1;
      }
    }

    for (let i = 0; i < a.length; i++) {
      if (used[i]) continue;

      used[i] = true;
      // biggerCount记录当前全排列中a[level] > b[level]的位置的数量, 此时a[level] == a[i]
      dfs(level + 1, used, biggerCount + (a[i] > b[level] ? 1 : 0));
      used[i] = false;
    }
  }

  dfs(0, new Array(a.length).fill(false), 0);

  console.log(ans);
})();

Java算法源码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
  static int[] a;
  static int[] b;

  static int maxBiggerCount = 0;
  static int ans = 0;

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    a = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    b = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

    // 求解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;

      used[i] = true;
      // biggerCount记录当前全排列中a[level] > b[level]的位置的数量, 此时a[level] == a[i]
      dfs(level + 1, used, biggerCount + (a[i] > b[level] ? 1 : 0));
      used[i] = false;
    }
  }
}

Python算法源码

# 输入获取
a = list(map(int, input().split()))
b = list(map(int, input().split()))

maxBiggerCount = 0
ans = 0


# 算法入口
def dfs(level, used, biggerCount):
    global maxBiggerCount, ans

    if level >= len(a):
        if biggerCount > maxBiggerCount:
            maxBiggerCount = biggerCount
            ans = 1
        elif biggerCount == maxBiggerCount:
            ans += 1

        return

    for i in range(len(a)):
        if used[i]:
            continue

        used[i] = True
        # biggerCount记录当前全排列中a[level] > b[level]的位置的数量, 此时a[level] == a[i]
        dfs(level + 1, used, biggerCount + (1 if a[i] > b[level] else 0))
        used[i] = False


# 算法调用
dfs(0, [False] * len(a), 0)

print(ans)

C算法源码

#include <stdio.h>

#define MAX_SIZE 10

int a[MAX_SIZE];
int a_size = 0;

int b[MAX_SIZE];
int b_size = 0;

int maxBiggerCount = 0;
int ans = 0;

void dfs(int level, int 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;

        used[i] = 1;
        // biggerCount记录当前全排列中a[level] > b[level]的位置的数量, 此时a[level] == a[i]
        dfs(level + 1, used, biggerCount + (a[i] > b[level] ? 1 : 0));
        used[i] = 0;
    }
}

int main() {
    while (scanf("%d", &a[a_size++])) {
        if (getchar() != ' ') break;
    }

    while (scanf("%d", &b[b_size++])) {
        if (getchar() != ' ') break;
    }

    int used[MAX_SIZE] = {0};

    // 求解a的全排列
    dfs(0, used, 0);

    printf("%dn", ans);

    return 0;
}

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?