时间限制: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;
}