aboutsummaryrefslogtreecommitdiff
path: root/max_num_int_choose_range1.c
blob: c44747552d51281e5721cf386d2703a51149cdcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 2554. Maximum Number of Integers to Choose From a Range I
#include "leetcode.h"

/*
 * you are given an integer array 'banned' and two integers 'n' and a 'maxSum'.
 * you are choosing some number of integers following the below rules: the
 * chosen integers have to be in the range '[1, n]', each integer can be chosen
 * at most once, the chosen integers should not be in the array 'banned', and
 * the sum of the chosen ntegers should not exceed 'maxSum'. return the maximum
 * number of integers you can choose following the mentioned rules.
 */

int maxCount(int *banned, int bannedSize, int n, int maxSum) {
  bool *valid = (bool *)malloc((n + 1) * sizeof(bool));
  memset(valid + 1, true, n * sizeof(bool));
  for (int i = 0; i < bannedSize; i++) {
    if (!(banned[i] >= 1 && banned[i] <= n))
      continue;
    valid[banned[i]] = false;
  }
  int cnt = 0, curr_sum = 0;
  for (int i = 1; i <= n; i++) {
    if (!valid[i])
      continue;
    if (!(curr_sum + i <= maxSum))
      break;
    cnt++, curr_sum += i;
  }
  free(valid);
  return cnt;
}

int main() {
  int b1[] = {1, 6, 5}, b2[] = {1, 2, 3, 4, 5, 6, 7}, b3[] = {11};
  printf("%d\n", maxCount(b1, ARRAY_SIZE(b1), 5, 6));  // expect: 2
  printf("%d\n", maxCount(b2, ARRAY_SIZE(b2), 8, 1));  // expect: 0
  printf("%d\n", maxCount(b3, ARRAY_SIZE(b3), 7, 50)); // expect: 7
}