给定一个由N个整数组成的数组arr [] ,任务是通过执行以下操作从给定数组中找到数组元素的平方的最大和:
- 选择任意一对数组元素(arr [i],arr [j])
- 将arr [i]替换为arr [i]和arr [j]
- 将arr [j]替换为arr [i]或arr [j] 。
例子:
Input: arr[] = {1, 3, 5}
Output: 51
Explanation:
For the pair (arr[1], arr[2]), perform the following operations:
Replace 3 with 3 AND 5, which is equal to 1.
Replace 5 with 2 OR 5, which is equal to 7.
The modified array obtained after the above steps is {1, 1, 7}.
Therefore, the maximized sum of the squares can be calculated by 1 * 1 + 1 * 1 + 7 * 7 = 51.
Input: arr[] = {8, 9, 9, 1}
Output: 243
方法:想法是观察到,如果x和y是选择的2个元素,则令z = x AND y , w = x OR y ,其中x + y = z + w 。
- 如果x≤y ,则不失一般性,显然z≤w 。因此,将表达式重写为x + y =(x-d)+(y + d)
Old sum of squares = M = x2 + y2
New sum of squares = N = (x – d)2 + (y – d)2, d > 0
Difference = N – M = 2d(y + d – x), d > 0
- 如果d> 0 ,则差为正。因此,我们成功地增加了平方和。上面的观察是由于以下事实:较大数字的平方大于较小数字的平方之和。
- 在将给定的整数转换为二进制形式后,我们观察到以下内容:
x = 3 = 0 1 1
y = 5 = 1 0 1
z = 1 = 0 0 1
w = 7 = 1 1 1
- x + y = 2 + 2 = 4中的总设置位,z + w = 1 + 3 = 4中的总设置位。因此,执行此操作后,将保留总设置位。现在的想法是找出z和w 。
For Example: arr[] = {5, 2, 3, 4, 5, 6, 7}
1 0 1 = 5
0 1 0 = 2
0 1 1 = 3
1 0 0 = 4
1 0 1 = 5
1 1 0 = 6
1 1 1 = 7
———-
5 4 4 (sum of set bits)
Now, sum up the squares of these numbers.
- 因此,对于每个位位置1到20进行迭代,将总位数存储在该索引中。
- 然后在构造数字时,每次从每个索引中取1位。
- 获取数字后,将数字的平方添加到答案中。
- 完成上述步骤后,打印答案的值。
以下是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Stores the maximum value
int ans = 0;
int binary[31];
// Function to find the maximum sum
// of squares for each element of the
// array after updates
void findMaximumSum(
const vector& arr, int n)
{
// Update the binary bit count at
// corresponding indices for
// each element
for (auto x : arr) {
int idx = 0;
// Iterate all set bits
while (x) {
// If current bit is set
if (x & 1)
binary[idx]++;
x >>= 1;
idx++;
}
}
// Construct number according
// to the above defined rule
for (int i = 0; i < n; ++i) {
int total = 0;
// Traverse each binary bit
for (int j = 0; j < 21; ++j) {
// If current bit is set
if (binary[j] > 0) {
total += pow(2, j);
binary[j]--;
}
}
// Square the constructed number
ans += total * total;
}
// Return the answer
cout << ans << endl;
}
// Driver Code
int main()
{
// Given array arr[]
vector arr = { 8, 9, 9, 1 };
int N = arr.size();
// Function call
findMaximumSum(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Stores the maximum value
static int ans = 0;
static int []binary = new int[31];
// Function to find the maximum sum
// of squares for each element of the
// array after updates
static void findMaximumSum(int []arr, int n)
{
// Update the binary bit count at
// corresponding indices for
// each element
for(int x : arr)
{
int idx = 0;
// Iterate all set bits
while (x > 0)
{
// If current bit is set
if ((x & 1) > 0)
binary[idx]++;
x >>= 1;
idx++;
}
}
// Connumber according
// to the above defined rule
for(int i = 0; i < n; ++i)
{
int total = 0;
// Traverse each binary bit
for(int j = 0; j < 21; ++j)
{
// If current bit is set
if (binary[j] > 0)
{
total += Math.pow(2, j);
binary[j]--;
}
}
// Square the constructed number
ans += total * total;
}
// Return the answer
System.out.print(ans + "\n");
}
// Driver Code
public static void main(String[] args)
{
// Given array arr[]
int[] arr = { 8, 9, 9, 1 };
int N = arr.length;
// Function call
findMaximumSum(arr, N);
}
}
// This code is contributed by Amit Katiyar
Python3
# Python3 program for the above approach
import math
binary = [0] * 31
# Function to find the maximum sum
# of squares for each element of the
# array after updates
def findMaximumSum(arr, n):
# Stores the maximum value
ans = 0
# Update the binary bit count at
# corresponding indices for
# each element
for x in arr:
idx = 0
# Iterate all set bits
while (x):
# If current bit is set
if (x & 1):
binary[idx] += 1
x >>= 1
idx += 1
# Construct number according
# to the above defined rule
for i in range(n):
total = 0
# Traverse each binary bit
for j in range(21):
# If current bit is set
if (binary[j] > 0):
total += int(math.pow(2, j))
binary[j] -= 1
# Square the constructed number
ans += total * total
# Return the answer
print(ans)
# Driver Code
# Given array arr[]
arr = [ 8, 9, 9, 1 ]
N = len(arr)
# Function call
findMaximumSum(arr, N)
# This code is contributed by code_hunt
C#
// C# program for the
// above approach
using System;
class GFG{
// Stores the maximum
// value
static int ans = 0;
static int []binary =
new int[31];
// Function to find the maximum
// sum of squares for each element
// of the array after updates
static void findMaximumSum(int []arr,
int n)
{
// Update the binary bit
// count at corresponding
// indices for each element
for(int i = 0; i < arr.Length; i++)
{
int idx = 0;
// Iterate all set bits
while (arr[i] > 0)
{
// If current bit is set
if ((arr[i] & 1) > 0)
binary[idx]++;
arr[i] >>= 1;
idx++;
}
}
// Connumber according
// to the above defined rule
for(int i = 0; i < n; ++i)
{
int total = 0;
// Traverse each binary bit
for(int j = 0; j < 21; ++j)
{
// If current bit is set
if (binary[j] > 0)
{
total += (int)Math.Pow(2, j);
binary[j]--;
}
}
// Square the constructed
// number
ans += total * total;
}
// Return the answer
Console.Write(ans + "\n");
}
// Driver Code
public static void Main(String[] args)
{
// Given array []arr
int[] arr = {8, 9, 9, 1};
int N = arr.Length;
// Function call
findMaximumSum(arr, N);
}
}
// This code is contributed by 29AjayKumar
243
时间复杂度: O(N log 2 A),其中A是数组的最大元素。
辅助空间: O(1)