题号:NC273647 原文:链接:https://ac.nowcoder.com/acm/problem/273647 来源:牛客网

小红拿到了一个数组,其中每个元素都是素数。小红准备进行若干次以下操作: 选择两个素数元素,将他们合并,生成的新元素为原来两个素数的乘积。 现在小红希望操作到不能再操作为止,然后使得最终的极差(最大值减最小值)尽可能小。你能帮帮她吗? 基本思路:要求极差尽可能小,则每次合并的数需为剩余数中的最大值和最小值,因此需先对数组排序,若数组中元素个数为奇数,则需保留最大值,从第二大值开始和最小值组合,并将组合结果存入另一个数组中,结束后对该数组排序,输出最大与最小值的差值 源码:#include<bits/stdc++.h> using namespace std; const int N=1e5; using ll=long long; ll a[N]; ll b[(N+1)/2]; int main() { int n;cin>>n; for(int i=0;i<n;i++)cin>>a[i]; sort(a,a+n); int i=0,j=n-n%2-1; while(i<j) { b[i]=a[i]*a[j]; i++; j--; } if(n%2) b[i]=a[n-1]; sort(b,b+n%2+n/2); ll c=b[n/2+n%2-1]-b[0]; cout<<c; return 0; }