题意
有一个数列长度为 n n n,每次进行一个操作:将序列中的任意两个元素 a a a 和 b b b 抹去,再加入一个元素 a × b + 1 a\times b+1 a×b+1,最后一定会变成一个值,问最后那个值的最大值减最小值为多少
思路
我们考虑每次将两个最大值抹去,再插入它们两个的乘积加一,也就是将两个最大值合并,下次抹去也就是上一次合并后的最大值和另一个最大值,再将其合并。可以发现,一直进行这样的操作所算出来的最后会是一个极大值和一个极小值,根据乘法原理,这样的话一定是最小值。
反之亦然。
代码
#include<bits/stdc++.h>
using namespace std;
int a[100001];
int a2[100001];
bool cmp(int x,int y){return x>y;}
int main()
{
int n,maxx,minx;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),a2[i]=a[i];
int qwq=n,homo=n;
while(qwq>1)
{
sort(a2+1,a2+n+1,cmp);
minx=a2[1]*a2[2]+1;
a2[1]=a2[2]=0;
a2[1]=minx;
qwq--;
}
while(homo>1)
{
sort(a+1,a+n+1);
maxx=a[1]*a[2]+1;
a[1]=a[2]=11451414;
a[1]=maxx;
homo--;
}
printf("%d",maxx-minx);
return 0;
}