淘气合影
题目描述
有 n 个孩子,他们的编号为 1 到 n,老师将他们根据身高排成一条直线(注意身高和编号的顺序无关),打算拍一张集体照。但他们非常淘气,接下来的故事连续发生了五次:
1. 老师将孩子们带到了正确的位置,然后离开摆弄相机;
2. 一部分孩子乘机开小差,胡乱地插到其他孩子的位置中间;
3. 老师按下快门,得到一张照片,发现有些孩子位子不对;
4. 老师将所有开小差的孩子教育了一顿,被教育的孩子接下来就不会淘气,也不会乱跑了,返回第一步。
注意,每一轮的流程中,都可能有新的孩子出来捣乱。老师重复了五次,其中在第 i 张照片中,排在队伍中第 j 名的孩子编号为 ai,j 。
小爱能从这五张照片里,还原出老师心目中原本正确的排位么?
输入数据保证有解,而且有唯一解。
输入格式
第一行:一个整数 n;
第二行到第六行:每行有 n 个整数,构成一个 1 到 n 的排列。表示一张照片拍下的学生编号序列。
输出格式
表示原本正确的位置中,应该排在第 i 名的孩子编号
数据范围
对于 30% 的数据,1 ≤ n ≤ 12;
对于 60% 的数据,1 ≤ n ≤ 300;
对于 100% 的数据,1 ≤ n ≤ 100,000。
样例数据
输入:
6
2 3 4 5 1 6
2 1 3 4 5 6
3 1 2 4 5 6
4 1 2 3 5 6
5 1 2 3 4 6
输出:
1 2 3 4 5 6
思路
参考程序
//C++参考程序
#include<iostream>
#include<algorithm>
using namespace std;
int pos[10005][6]; //n个人每次的站位置
int a[100005];//n个人的编号
//判断x是否在y的左侧
//统计x站在y左侧的次数3次以上 x在y的左侧
//sort函数 cmp参数的作用
bool cmp(int x,int y)
{
int left=0;
for(int i=1;i<=5;i++)
{
if(pos[x][i]<pos[y][i])
{
left++;
}
return left>=3;
}
}
int main()
{
int n;//n个人
cin>>n;
int x;
for(int i=1;i<=n;i++)
{
a[i]=i;
}
for(int i=1;i<=5;i++) //5次
{
for(int j=1;j<=n;j++) //n个人
{
cin>>x;
pos[x][i]=j; //编号x的人站的位置
}
}
sort(a+1,a+n,cmp);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}