1.题号:NC25519

2.题目原文:

小红拿到了一个数组,其中每个元素都是素数。小红准备进行若干次以下操作: 选择两个素数元素,将他们合并,生成的新元素为原来两个素数的乘积。 现在小红希望操作到不能再操作为止,然后使得最终的极差(最大值减最小值)尽可能小。你能帮帮她吗?

- 输入描述:
  • 第一行输入一个正整数n,代表小红拿到的数组。
  • 第二行输入n个正整数ai,代表数组中的元素。保证ai是素数。
输出描述:
  • 一个整数,代表合并后的数组的极差。

3.牛客OJ链接:https://ac.nowcoder.com/acm/problem/273647

4.思路:

  • 显然,第一步应当将数据排序;
  • 对于偶数个数据,应该首尾相乘,并判断最值,最值相减可得最小极差;
  • 对于奇数个数据,应该除去最大元素首尾相乘,并判断最值,再用原最大值更新最值,最值相减可得最小极差。

5.代码:

using namespace std;
typedef long long ll;
const int N = 1e5+9;
const ll M = 1e18+9;
ll a[N];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    ll mi=M,ma=0;
    
    if(n&1)
    {
        int l=1,r=n-1;
        while(l<r)
        {
            mi=min(mi,a[l]*a[r]);
            ma=max(ma,a[l]*a[r]);
            l++;r--;
        }
        mi=min(mi,a[n]);
        ma=max(ma,a[n]);
    }
    else
    {
        int l=1,r=n;
        while(l<r)
        {
            mi=min(mi,a[l]*a[r]);
            ma=max(ma,a[l]*a[r]);
            l++;r--;
        }
    }
    cout<<ma-mi;
    return 0;
}