这个。。。。本来以为很简单的题!!!!我写了两个小时!!!!!【不过主要还是我太太太太太太太辣鸡了(:з」∠)是真真真真真真真真辣鸡】
debug的时候发现第三次合并的时候MAX和MIN的值就是上一次合并的时候的值了,并没有递归回去被更新,于是上网搜了题解,发现只要每次重新定义一次MAX和MIN就行了,这种错误要记住。
#include <cstdio>
int a[105], MAXX, MINN;
void divide(int l, int r, int &MAXX, int &MINN)
{
if (l == r)
{
MAXX = a[l];
MINN = a[r];
}
else if (r == l + 1)
{
if (a[r] > a[l])
{
MAXX = a[r]; MINN = a[l];
}
else
{
MAXX = a[l]; MINN = a[r];
}
return;
}
else
{
int d = (l + r) / 2;
int MAX1, MIN1;
divide(l, d, MAX1, MIN1);
int MAX2, MIN2;
divide(d + 1, r, MAX2, MIN2);
if (MAX1 > MAX2)
{
MAXX = MAX1;
}
else
{
MAXX = MAX2;
}
if (MIN1 < MIN2)
{
MINN = MIN1;
}
else
{
MINN = MIN2;
}
}
//printf("%d %d\n", MAXX, MINN);
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
divide(1, n, MAXX, MINN);
printf("%d %d\n", MAXX, MINN);
return 0;
}
不过好像说这样然并卵,因为比较次数并没有减少。反正比赛的时候也不会去写这么一长串的,不管了。