直接贪心。
每次选择两个最小的,得到max,反之,得到min。
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
bool cmp (int x,int y)
{
return x>y;
}
int a[55000],b[55000];
int main()
{
int N,i,max_m,min_m;
while(scanf("%d",&N)==1&&N!=0)
{
for(i=0; i<N; i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a,a+N);
for(i=0; i<N; i++)
{
if(a[i]!=0&&a[i+1]!=0)
{
a[i+1]=a[i]*a[i+1]+1;
a[i]=0;
sort(a,a+N);
}
else if(a[i]!=0&&a[i+1]==0)
{
max_m=a[i];
break;
}
}
sort(b,b+N,cmp);
for(i=0; i<N; i++)
{
if(b[i]!=0&&b[i+1]!=0)
{
b[i+1]=b[i]*b[i+1]+1;
b[i]=0;
sort(b,b+N,cmp);
i=-1;
}
else if(b[i]!=0&&b[i+1]==0)
{
min_m=b[i];
break;
}
}
printf("%d\n",max_m-min_m);
}
return 0;
}