笔试代码题--C++--深信服--田忌赛马
题目描述:田忌的马和齐王的马比赛,田忌知道齐王的马标号以及出场顺序以及速度大小,问田忌怎么安排自己的出场顺序,能胜算大。
输入描述:N:代表总共N场比赛,T代表这场比赛中有速度为Ai的共T匹马上场。然后是齐王的马速度以及排位顺序,下一行是田忌的马的速度以及顺序
输出描述:第一场的田忌的马的标号顺序,例如下面的例子中第二行是2 3 1 4,代表在(4 7 10 6)中,应该上场的顺序为(7 10 4 6)。
实例1:
输入:
2
3
2 1 3
6 5 4
4
7 8 2 4
4 7 10 6
输出:
2 3 1
2 3 1 4
解题思路:(1)先将两个数组中的数据排序,得到S_boos,S_tian,
(2)然后再大循环中从齐王的出马顺序开始遍历,先来给i=0号下标的马找对应的田的马,
(3)然后内循环中,先是在排好序的齐王数组中找到下标位置,然后再在对应下标的田忌的排序数组中找打要出什么速度的马,
(4)然后在田忌原顺序的马中确定是第几匹,输出序号即可。
如下图:
代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int T, N;
cin >> T;
while (T--)
{
cin >> N;
vector<int> boss;
vector<int> tian;
for (int i = 0; i < N; i++)
{
int temp;
cin >> temp;
boss.push_back(temp);
}
for (int i = 0; i < N; i++)
{
int temp;
cin >> temp;
tian.push_back(temp);
}
vector<int> F_boss(boss.begin(), boss.end());
vector<int> F_tian(tian.begin(), tian.end());
sort(F_boss.begin(), F_boss.end());
sort(F_tian.begin(), F_tian.end());
int index;
vector<int>res;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (F_boss[j] == boss[i])
{
index = j;
break;
}
}
for (int j = 0; j < N; j++)
{
if (tian[j] == F_tian[index])
{
res.push_back(j + 1);
break;
}
}
}
for (int i = 0; i < N - 1; i++)
{
cout << res[i] << ' ';
}
cout << res[N - 1] << endl;
}
return 0;
}