田忌赛马是一个故事:
齐国使者到大梁来,孙膑以刑徒的身份秘密拜见,劝说齐国使者。齐国使者觉得此人是个奇人,就偷偷地把他载回齐国。齐国将军田忌非常赏识他,并且待如上宾。田忌经常与齐国众公子赛马,设重金赌注。孙膑发现他们的马脚力都差不多,马分为上、中、下三等,于是对田忌说:“您只管下大赌注,我能让您取胜。”田忌相信并答应了他,与齐王和各位公子用千金来赌注。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,用您的上等马对付他们的中等马,用您的中等马对付他们的下等马。”三场比赛结束后,田忌一场败而两场胜,最终赢得齐王的千金赌注。因此田忌把孙膑推荐给齐威王。齐威王向他请教了兵法,封他为军师。
输入说明:
第一行,输入比赛的轮次n
第二行n个数,表示齐威王的出马顺序
第三行n个数,代表田忌的马速,
输出说明:
一行,田忌赛马的出马顺序。
输出示例1:
5
12 89 34 66 20
67 16 24 95 42
输出样例1:
2 4 5 1 3
输入样例2:
4
8 6 5 7
5 6 7 8
输出样例2:
4 2 1 3
直接全排列解:
甚至可以直接套用模板,没有什么难度
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100+10;
int n;
int q[N];
int t[N];
int arr[N];
int check(){
for(int i=1;i<=n;i++){
if(t[arr[i]]<q[i])
return 0;
}
return 1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>q[i];
}
for(int i=1;i<=n;i++){
cin>>t[i];
arr[i]=i;
}
do{
if(check()){
for(int i=1;i<=n;i++){
cout<<arr[i]<<" ";
}
break;
}
}while(next_permutation(arr+1, arr + 1+n));
return 0;
}