最小值与最大值

现在有​2n个int范围的数存在数组a中(下标范围为1​到2n​)现在你需要找出其中的最小值和最大值。

现在提供了int cmp(int i, int j)函数,函数的返回值如下

返回值 说明
1 ​ai>aj
0 ​ai=aj
-1 ​ai<aj
-2 参数不合法。遇到这个时,请即时停止你的程序,你将获得Wrong Answer

你需要尽可能少的调用cmp来解决此问题,找到最小值和最大值。

输入描述

输入代码由系统帮助实现。

输入第一行包含一个整数n [1,100000]​。

第二行包含以空格隔开的2n​个int范围内的整数。

输出描述

你需要在你的函数里输出最小值和最大值的下标,以空格隔开。如果有多个最小值或最大值,输出任意一个即可。

接下来将由系统输出你的询问记录。

当你的答案正确且你询问的次数为3n-2​时,你将AC此题。

预设代码

前置代码

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
 
#include <bits/stdc++.h>  
using namespace std;  
const int maxn = 200005;  
int n;  
int a[maxn];  
void findminandmax(int n); // you should finish this  
int cmp(int i, int j)  
{  
    if (i <= 0 || i > 2 * n || j <= 0 || j > 2 * n) return -2;  
    if (a[i] > a[j]) return 1;  
    if (a[i] == a[j]) return 0;  
    if (a[i] < a[j]) return -1;  
}  
int main()  
{  
    scanf("%d", &n);  
    for (int i = 1; i <= 2 * n; i++)  
        scanf("%d", &a[i]);  
    findminandmax(n);  
    return 0;  
}  
/* 
void findminandmax(int n) 
{ 
// finish this 
} 
*/  
  
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */  
  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 1↵
  2. 1 2↵
以文本方式显示
  1. 1 2↵
  2. 1↵
  3. 1 2↵
1秒 153600KB 0
void findminandmax(int n)  
{  
  int k,l,big[n+1],small[n+1],judge,m,max,min; 
   for(k=1,l=1;k<2*n;k+=2,l++) 
 { 
      judge=cmp(k,k+1); 
      if((judge==1)||(judge==0)) 
     { 
          big[l]=k; 
          small[l]=k+1; 
      } 
      if(judge==-1)  
     { 
          big[l]=k+1; 
            small[l]=k; 
        }    
    } 
  max=big[1]; 
    for(m=1;m<n;m++) 
    { 
     judge=cmp(max,big[m+1]); 
       if(judge==-1) max=big[m+1]; 
     } 
  min=small[1]; 
  for(m=1;m<n;m++) 
    { 
     judge=cmp(min,small[m+1]); 
     if(judge==1) min=small[m+1]; 
    } 
  printf("%d %d\n",min,max);    
}  
发布了19 篇原创文章 · 获赞 1 · 访问量 170

猜你喜欢

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