【题解】淘气合影

淘气合影

题目描述

有 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;
} 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员莫小特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值