题目链接https://www.acwing.com/problem/content/2051/
思路 :
我们可以一开始只比较两头奶牛a和b,如何判定奶牛(a,b)的排列顺序呢?
题目中每头奶牛只能在每轮拍照中移动一次,且拍完后位置会被复原,也就是说,奶牛a和奶牛b的相对位置只会有两轮与实际情况不同,一轮是a移动到b后面被拍照,另一轮是b移动了且刚好移动到a的前面被拍照,也就是说,我们只需要五轮就可以唯一确定,即当a在b前面的次数大于等于3时,奶牛a的位置一定在奶牛b的位置的前面
题中输入格式
第一行包含整数 N,表示奶牛数量。
接下来 5N 行,每 N 行描述一张照片中的奶牛顺序,每行包含一个奶牛的编号。
开一个数组a[6][N]
a[1~5][A[1..N]]的值表示的是奶牛每轮的位置 ,其中A[1..N]表示奶牛的编号
a[0][j]的值表示的是奶牛的编号
补充 :
二维数组 a[N][N]
a[0]:表示二维数组的第1行第1个数的地址
a[0]+1:表示二维数组第1行第1个数的地址
代码 :
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 20010;
int a[6][N];
bool cmp(int x,int y)
{
//传进来的是奶牛的编号,比较这5轮两头奶牛的相对排列顺序
int c=0;
for(int i=1;i<=5;i++){
//第i轮奶牛a、b的位置比较
//当编号为x的牛在编号为y的牛的前面时
if(a[i][x]<a[i][y]) c++;
}
//假如a排在前面的次数大于2,则奶牛a在b前面
//否则b在a前面
return c>2;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=5;i++)
{
for(int j=1;j<=n;j++){
int x; //第i张照片中位置为j的奶牛的编号
cin>>x;
a[i][x]=j; //编号为x的奶牛第i轮占的位置为j
a[0][j]=x; //记录每个奶牛的编号,用来排序
}
}
//a[1~5][A[1..N]]的值表示的是奶牛每轮的位置 ,其中A[1..N]表示奶牛的编号
//a[0][j]的值表示的是奶牛的编号
sort(a[0]+1,a[0]+n+1,cmp);
for(int i=1;i<=n;i++)
cout<<a[0][i]<<endl;
return 0;
}