小伙伴的一道笔试题-田忌赛马

田忌赛马是一个故事:
齐国使者到大梁来,孙膑以刑徒的身份秘密拜见,劝说齐国使者。齐国使者觉得此人是个奇人,就偷偷地把他载回齐国。齐国将军田忌非常赏识他,并且待如上宾。田忌经常与齐国众公子赛马,设重金赌注。孙膑发现他们的马脚力都差不多,马分为上、中、下三等,于是对田忌说:“您只管下大赌注,我能让您取胜。”田忌相信并答应了他,与齐王和各位公子用千金来赌注。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,用您的上等马对付他们的中等马,用您的中等马对付他们的下等马。”三场比赛结束后,田忌一场败而两场胜,最终赢得齐王的千金赌注。因此田忌把孙膑推荐给齐威王。齐威王向他请教了兵法,封他为军师。

输入说明:
第一行,输入比赛的轮次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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值