给定一个由 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,则答案为 YES,否则为 NO。
下面是上述方法的实现:
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
?>
Javascript
输出:
Yes
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。