bluecode-2024D-田忌赛马

32 阅读1分钟

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

描述

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

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

输入描述

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

输出描述

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

用例输入 1 **

11 12 20
10 13 7

用例输出 1 **

2

提示

有两个 a 数组的排列可以达到最优结果,[12, 20, 11]和[11, 20, 12],故输出 2

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>

using namespace std;

int maxWinNum = 0;
int ans = 0;

void dfs(vector<int>& a, vector<int>& b, int idxB, int n, int winNum, vector<bool>& used){
    int restNoUsed = 0;
    for(bool flag : used){
        if(!flag){
            restNoUsed++;
        }
    }
    
    if(maxWinNum > winNum + restNoUsed){
        return;
    }
    
    if(winNum == maxWinNum){
        int fact = 1;
       	for(int i = 1; i < restNoUsed; ++i){
            fact *= i;
        }
        ans += fact;
        return;
    }
    
    for(int idxA = 0; idxA < n; ++idxA){
		if(!used[idxA]){
            used[idxA] = true;
            dfs(a, b, idxB + 1, n, winNum + (a[idxA] > b[idxB] ? 1 : 0), used);
            used[idxA] = false;
        }        
    }
}

int main(){
    vector<int> a,b;
    string input;
    
    getline(cin, input);
    stringstream ss(input);
    int num;
    while(ss >> num){
        a.push_back(num);
    }
    
    getline(cin, input);
    stringstream ss2(input);
    while(ss2 >> num){
        b.push_back(num);
    }
    
    int n = a.size();
    vector<bool> used(n, false);
    
    sort(a.begin(), a.end(), greater<int>());
    sort(b.begin(), b.end(), greater<int>());
    
    int idxA = 0, idxB = 0;
    while(idxB < n){
        if(a[idxA] > b[idxB]){
            idxA++;
            idxB++;
            maxWinNum++;
        }else{
            idxB++;
        }
    }
    
    if(maxWinNum == 0){
        cout << ans << endl;
    }else{
        dfs(a, b, 0, n, 0, used);
        cout << ans << endl;
    }
    
    return 0;
}