查找d以最大化在c ++中创建的数组c []中的零数目,这是c [i] = d * a [i] + b [i]

概念

对于两个给定的M个整数数组,假定一个数组C,其中第i个整数将是d * a [i] + b [i],其中d表示为任意实数。我们的任务是显示或打印d,以使数组C的零个数最多,同时也打印零个数。

输入值

a[] = {15, 40, 45}
b[] = {4, 5, 6}

输出结果

Value of d is: -0.133333
The number of zeros in array C is: 1
If we choose d as -0.133333 then we get one zero in the array C which is the maximum possible.

方法

我们按照以下提到的步骤来解决上述问题-

  • 我们将等式重写为d = -b [i] / a [i]

  • 实现哈希表以计算任何实数中出现的最大次数,以获得d的值。

  • 现在,我们得出结论,零的数量将是最大的计数+(对数a [i]和b [i]均为零)。

示例

// C++ program to implement the above
//方法
#include <bits/stdc++.h>
using namespace std;
//显示函数以找到d的值
//并在数组中找到零的数量
void findDandZeros1(int a[], int b[], int m){
   //显示哈希表
   unordered_map<long double, int> mpp1;
   int count1 = 0;
   //对第i个元素执行迭代
   for (int i = 0; i < m; i++) {
      //现在,如果两个都不都是0-
      if (b[i] != 0 && a[i] != 0) {
         long double val1 = (long double)(-1.0 * b[i]) /
         (long double)(a[i]);
         mpp1[val1] += 1;
      }
      //现在如果两个都为0-
      else if (b[i] == 0 && a[i] == 0)
         count1 += 1;
      }
      //用于查找最大出现的d-
      int maxi1 = 0;
      for (auto it : mpp1) {
         maxi1 = max(it.second, maxi1);
   }
   //用于打印出现最大次数的d-
   for (auto it : mpp1) {
      if (it.second == maxi1) {
         cout << "Value of d is: "
         << it.first << endl;
         break;
      }
   }
   //用于打印零的数量
   cout << "The number of zeros in array C is: "
   << maxi1 + count1;
}
//驱动程式码
int main(){
   int a[] = { 15, 40, 45 };
   int b[] = { 4, 5, 6 };
   int m = sizeof(a) / sizeof(a[0]);
   findDandZeros1(a, b, m);
   return 0;
}

输出结果

Value of d is: -0.133333
The number of zeros in array C is: 1