使用 C++ 中的给定操作将数组缩减为单个整数
给定一个整数变量Number作为输入。让我们考虑一个包含1到Number范围内任意顺序元素的数组。如果我们对数组执行Number-1次操作,使得
我们从数组中选择两个元素A和B
从数组中删除A和B
将A和B的平方和添加到数组中
我们最终会得到一个整数值;目标是找到该元素的最大可能值。
使用优先队列
为了使最终结果最大化,我们必须选择A和B使它们最大。
为了找到最大值A和B,我们将使用一个优先级队列来存储其中元素的值。
优先级队列以降序存储元素。
最顶层元素的值最大,依此类推。因此,在弹出两个元素后,我们将再次将它们的方块推入队列。
将弹出并按下Number-1次以获得所需的结果。
例子
输入 -数字=2
输出 -数组缩减后的单个元素:5
说明 -假设我们将数组中的元素设为[12]
插入优先队列后-:21
A=5,B=4:A2+B2=1+4=5
最后一个元素:5
输入 -数字=5
输出 -数组缩减后的单个元素:5
说明-假设我们将数组中的元素设为[51243]
插入优先队列后-:54321
A=5,B=4:A2+B2=25+16=41:41321
A=41,B=3:A2+B2=1681+9=1690:169021
A=1690,B=2:A2+B2=1681+4=2856104:28561041
A=2856104,B=1:A2+B2=1187163712+1=1187163713:1187163713
最后一个元素:1187163713
下面程序中使用的方法如下
在这种方法中,我们将优先队列以降序存储数组元素。弹出前两个最大元素并将两者的平方和再次推送到该队列。这样做直到只剩下一个值。
取输入变量Number。
将结果的数据类型作为长整型-lli
函数reduceArray(intNum)获取输入数字并返回使用上述操作计算的最大单个整数。
取一个优先队列作为pQueue。
使用while循环用数字1到N填充pQueue。
当i<=Num时,将i推入pQueue
现在pQueue有1到N的降序整数,大小为N。
现在使用while循环遍历pQueue直到其大小>=1。
取最大值为var1=并弹出它。pQueue.top()
取下一个最大值作为var2=并弹出它。pQueue.top()
将var1设置为其正方形,将var2设置为其正方形。
再次将var1+var2推送到pQueue。
在while循环结束时,返回顶部元素。
在main中打印结果。
示例
#include <bits/stdc++.h> using namespace std; #define lli long long int int reduceArray(int Num){ priority_queue<lli> pQueue; int i=1; while(i<=Num){ pQueue.push(i); i=i+1; } while (pQueue.size() > 1) { lli var1 = pQueue.top(); pQueue.pop(); lli var2 = pQueue.top(); pQueue.pop(); var1=var1*var1; var2=var2*var2; pQueue.push(var1+var2); } return pQueue.top(); } int main(){ int Number = 5; cout<<"数组缩减后的单个元素: "<<reduceArray(Number); return 0; }输出结果
如果我们运行上面的代码,它将生成以下输出
数组缩减后的单个元素: 1187163713