理解题意:每次擦去其中的两个数 a和 b,然后在数列中加入一个数 a×b+1,如此下去直至黑板上剩下一个数为止,在所有按这种操作方式最后得到的数中,最大的为 max,最小的为 min。
样例:1,2,3;
可以((1*2)+1)3=9;
((13)+1)2=8;
((23)+1)*1=7;
由此证明先运算小数据得最大值,先运算大数据得最小值。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int arr1[5002];//最小
int arr2[5002];//最大
bool cmp1(int a,int b){
return a<b;
}
bool cmp2(int a,int b){
return b<a;
}
int min(int n){
while(n>2){
sort(arr1,arr1+n,cmp1);
arr1[n-2]=arr1[n-2]*arr1[n-1]+1;
n--;
}
return arr1[1]*arr1[0]+1;
}
int max(int n){
while(n>2){
sort(arr2,arr2+n,cmp2);
arr2[n-2]=arr2[n-2]*arr2[n-1]+1;
n--;
}
return arr2[1]*arr2[0]+1;
}
int main (){
int n;
while(scanf("%d",&n)!=EOF&&n!=0){
for(int i=0;i<n;i++){
scanf("%d",&arr1[i]);
arr2[i]=arr1[i];
}
printf("%d\n",max(n)-min(n));
}
return 0;
}