给定n个正元素数组。在每个操作中,您可以选择一些元素并将它们减少1,将剩余元素增加m。任务是确定在某些迭代之后是否可以使给定数组的至少一半元素等于零。
例子:
Input : arr[] = {3, 5, 6, 8}, m = 2
Output : Yes
Input : arr[] = {4, 7, 12, 13, 34}, m = 7
Output : No
如果我们尝试分析问题陈述,我们会发现在任何步骤中,您将元素减少1或将元素增加m。这意味着,如果我们比较两个元素,则在执行的每个步骤中总共有三种可能性。
令a1和a2为两个元素:
- 两个元素都减少了1,因此它们的实际差异没有变化。
- 两个元素都增加了m,因此它们的实际差值再次没有变化。
- 一个元素减少了1,另一个元素增加了m,因此实际差值改变了(m + 1)。
这意味着在每一步上,您都将保持两个元素之间的差异相同或将其增加(m + 1)。
因此,如果将所有元素的模数乘以(m + 1)并保持其频率,我们可以检查在任何时间点可以使多少个元素等于零。
算法 :
- 创建大小为m + 1的哈希表
- 将元素的频率捕获为(arr [i]%(m + 1))并存储在哈希表中。
- 找出最大频率,如果最大频率大于或等于n / 2,则答案为“是”,否则为“否”。
下面是上述方法的实现:
C++
// C++ program to find whether half-array
// reducible to 0
#include
using namespace std;
// Function to print the desired
// result after computation
void isHalfReducible(int arr[], int n, int m)
{
int frequencyHash[m + 1];
int i;
memset(frequencyHash, 0, sizeof(frequencyHash));
for (i = 0; i < n; i++) {
frequencyHash[arr[i] % (m + 1)]++;
}
for (i = 0; i <= m; i++) {
if (frequencyHash[i] >= n / 2)
break;
}
if (i <= m)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
// Driver Code
int main()
{
int arr[] = { 8, 16, 32, 3, 12 };
int n = sizeof(arr) / sizeof(arr[0]);
int m = 7;
isHalfReducible(arr, n, m);
return 0;
}
Java
// Java Program to find whether half-array
// reducible to 0
public class GFG {
// Function to print the desired
// result after computation
static void isHalfReducible(int arr[], int n, int m)
{
int frequencyHash[] = new int[m + 1];
int i;
for(i = 0 ; i < frequencyHash.length ; i++)
frequencyHash[i] = 0 ;
for (i = 0; i < n; i++) {
frequencyHash[arr[i] % (m + 1)]++;
}
for (i = 0; i <= m; i++) {
if (frequencyHash[i] >= n / 2)
break;
}
if (i <= m)
System.out.println("Yes") ;
else
System.out.println("No") ;
}
// Driver code
public static void main(String args[])
{
int arr[] = { 8, 16, 32, 3, 12 };
int n = arr.length ;
int m = 7;
isHalfReducible(arr, n, m);
}
// This code is contributed by ANKITRAI1
}
Python3
# Python3 program to find whether
# half-array reducible to 0
# Function to print the desired
# result after computation
def isHalfReducible(arr, n, m):
frequencyHash =[0]*(m + 1);
i = 0;
while(i < n):
frequencyHash[(arr[i] % (m + 1))] += 1;
i += 1;
i = 0;
while(i <= m):
if(frequencyHash[i] >= (n / 2)):
break;
i += 1;
if (i <= m):
print("Yes");
else:
print("No");
# Driver Code
arr = [ 8, 16, 32, 3, 12 ];
n = len(arr);
m = 7;
isHalfReducible(arr, n, m);
# This code is contributed by mits
C#
// C# Program to find whether half-array
// reducible to 0
using System;
public class GFG {
// Function to print the desired
// result after computation
static void isHalfReducible(int[] arr, int n, int m)
{
int[] frequencyHash = new int[m + 1];
int i;
for(i = 0 ; i < frequencyHash.Length ; i++)
frequencyHash[i] = 0 ;
for (i = 0; i < n; i++) {
frequencyHash[arr[i] % (m + 1)]++;
}
for (i = 0; i <= m; i++) {
if (frequencyHash[i] >= n / 2)
break;
}
if (i <= m)
Console.WriteLine("Yes") ;
else
Console.WriteLine("No") ;
}
// Driver code
public static void Main()
{
int[] arr = { 8, 16, 32, 3, 12 };
int n = arr.Length ;
int m = 7;
isHalfReducible(arr, n, m);
}
// This code is contributed by Subhadeep
}
PHP
= ($n / 2))
break;
}
if ($i <= $m)
echo "Yes\n";
else
echo "No\n";
}
// Driver Code
$arr = array( 8, 16, 32, 3, 12 );
$n = sizeof($arr);
$m = 7;
isHalfReducible($arr, $n, $m);
// This code is contributed by mits
?>
输出:
Yes