找大佬

众所周知,每个专业里都会有一些大佬隐藏在人群里。软件工程专业也是如此。今天的你就像从人群中找到真正的大腿,找到这个大佬。

假设现在有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 */  
  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 2↵
  2. 0 0↵
  3. 1 0↵
以文本方式显示
  1. 2↵
  2. 3↵
  3. 2 1↵
  4. 1 2↵
  5. 2 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]);         
}  
发布了19 篇原创文章 · 获赞 1 · 访问量 171

猜你喜欢

转载自blog.csdn.net/CN_BIT/article/details/104649410