众所周知,每个专业里都会有一些大佬隐藏在人群里。软件工程专业也是如此。今天的你就像从人群中找到真正的大腿,找到这个大佬。
假设现在有n名同学(编号为1到n)在班级里,这里面可能存在最多一名大佬。大佬的定义如下:
-
他比其他个人n-1都强
-
其他n-1个人都不比他强
我们假设强的关系不一定是绝对的(可能出现我比你强,你也比我强的情况),也不具有传递性(a比b强,b比c强,a不一定比c强),现在给你提供了int better(int a, int b)
函数,该函数的参数含义如下:
参数 | 说明 |
---|---|
a | 询问的第一个人 |
b | 询问的第二个人 |
返回值说明如下:
返回值 | 说明 |
---|---|
1 | a比b强 |
0 | a不比b强 |
-1 | 参数不合法,遇到这个时,请即时停止你的程序,你将获得Wrong Answer |
我们规定自己不比自己强。
你要尽可能少的调用better函数来解决此问题,来找出真正的大佬。
输入描述
输入代码由系统帮助实现,我们约定人数n [2,1000]。
输入第一行包括一个整数,表示人数。
接下来n行,每行包括n个整数good[i][j]
,如果其为0,表示 i 不比 j 强,如果其为1表示 i 比 j 强。
输出描述
你需要在你的函数里输出你找到的大佬,如果你没有找到,输出-1
。
接下来将由系统输出你的询问记录。
当你的答案正确且你询问的次数在标程的3倍以内时,你将AC此题。
预设代码
前置代码
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int n;
bool good[maxn][maxn];
void guessdalao(int n); // you should finish this
int better(int a, int b)
{
if (a <= 0 || a > n || b <= 0 || b > n) return -1;
return good[a][b];
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
int t;
scanf("%d", &t);
good[i][j] = t;
}
guessdalao(n);
return 0;
}
/*
void guessdalao(int n)
{
// finish this
}
*/
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
|
以文本方式显示
|
1秒 | 153600KB | 0 |
void guessdalao(int n)
{
int mate[n],i,j,k,l,m,choose[n];
int temp,addtemp;
int n0=n,n1=n,flag=1;
for(i=0;i<n;i++) mate[i]=i+1; //record the mate
while(1)
{
for(j=1,k=0;j<n1;j+=2,k++)
{
temp=better(mate[j-1],mate[j]);
if(temp==1) choose[k]=mate[j-1]; //choose the stronger
if(temp==0) choose[k]=mate[j];
//printf("%d,%d,%d\n",k,j,choose[k]) ;
}
if(n1%2==1)
{
choose[k]=mate[n1-1];
k=k+1;
} //remain the odd number
n1=k;
for(l=0;l<n1;l++) mate[l]=choose[l]; //remain stronger ones
if(n1==1) break;
}
//("%d\n",mate[0]);
for(m=1;(m<n0+1)&&(flag==1);m++) //compare the one who wins with all the orignal mate
{
if(mate[0]==m) continue;
temp=better(mate[0],m);
addtemp=better(m,mate[0]);
if((temp!=1)||(addtemp!=0))
{
flag=0;
//printf("02\n");
break;
}
}
if(flag==0) printf("-1\n");
if(flag==1) printf("%d\n",mate[0]);
}