给定一个正数数组以及两个整数A和B。两个玩家正在玩一个游戏,他们将减少数组中的数字。玩家1可以将数组的任何元素减少A,而玩家2可以将数组的任何元素增加B。目标是找到玩家1可以减少到0或更少的数字计数。第一步。一旦减少到0或更少的数字,玩家2就不会考虑。
例如
arr[] = { 1,4,5,2 } A=2, B=3输出结果
在游戏中可以减少到零或更少的数字计数是: 1
The only number that can be reduced by player 1 is 1 as on first move it will be reduced to −1. Rest all will become greater than A after player 2 increases their value.
arr[] = { 1,4,5,2 } A=4, B=4输出结果
在游戏中可以减少到零或更少的数字计数是: 2
On first move player 1 reduces 4 to 0. arr[]= [ 1, 0, 5, 2 ] Player 2 will increase 1 to 4. arr[]= [ 5, 0, 5, 2 ] Player 1 will decrease 2 to −2. Arr[] = [ 5, 0, 5, −2 ]. From now onwards all numbers are greater than A so cannot be reduced by player 1 to 0 or less as player 2 is also increasing them simultaneously.
以下程序中使用的方法如下-
在这种方法中,首先检查A> B。如果是,则在N步中A会将arr []的N个元素全部减小为0或less.IfA <= B然后我们将检查
即使玩家2将B加到后,所有不大于A的数字。假设此计数为C1。
在玩家2将B加到A之后,所有小于A并大于A的数字。假设此计数为C2。
总计数为C = C1 +(C2 + 1)/ 2。与情况2一样,随着两个玩家同时增加/减少他们,只有一半会减少到0或更少。而玩家2只能将其中一半增加到大于A。与此同时,玩家1会将另一半减少到<= 0。
取一个包含正数的整数数组。
取两个变量A和B。
函数reduce_zero(int arr [],int大小,int A,int B)将返回在游戏中可以减少为零或更少的数字的计数
将初始计数设为0。
将两个变量temp_1和temp_2用作临时计数。
如果A> B,则返回为size的数组的长度。
现在使用for循环遍历数组,对于每个arr [i],如果元素和B <A的总和,则使temp_1递增。
对于每个元素arr [i] <= A,增加temp_2。
现在,在for循环结束之后,取count = temp_1 +(temp_2 + 1)/ 2。如公式所示。
返回计数作为结果。
#include <bits/stdc++.h> using namespace std; int reduced_zero(int arr[], int size, int A, int B){ int count = 0; int temp_1 = 0, temp_2 = 0; if (A > B){ return size; } for(int i = 0; i < size; i++){ if (A >= arr[i] + B){ temp_1++; } else if(A >= arr[i]){ temp_2++; } } int temp = (temp_2 + 1) / 2; count = temp + temp_1; return count; } int main(){ int arr[] = { 3, 3, 1, 2, 4, 7, 1}; int A = 4, B = 1; int size = sizeof(arr) / sizeof(arr[0]); cout<<"在游戏中可以减少到零或更少的数字计数是: "<<reduced_zero(arr, size, A, B); return 0; }输出结果
如果我们运行上面的代码,它将生成以下输出-
在游戏中可以减少到零或更少的数字计数是: 7