现在有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 */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
|
以文本方式显示
|
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);
}