thảo luận Leetcode + Codeforces, Competitive programming contest. Đường tới Guardian + Candidate Master.

  • Người tạo chủ đề Người tạo chủ đề freedom.9
  • Ngày bắt đầu Ngày bắt đầu
Thôi rút ống thở rồi, may mà dùng acc clone. Dùng greedy build từ most significant bit tới last significant bit thôi mà code ko ra =((
 
Solution Q4 cuối cùng của tui vẫn mất 11000ms. May là Leetcode thoáng, chứ giới hạn 2-3s như Codeforce thì không qua nổi câu này :D
Python:
class Solution:
    def maximumAND(self, nums: List[int], k: int, m: int) -> int:
        # Chuyển số thành mảng bit
        def to_bit_array(val):
            arr = []
            for i in range (32):
                arr.append(val%2)
                val >>= 1
            return arr[::-1]

        # Chuyển mảng bit thành số
        def to_int(arr):
            num = 0
            for bit in arr:
                num <<= 1
                num += bit
            return num

        # Đếm số lần cộng để (val & target) == target
        def count_ops(val, target):
            result = 0
            i = 0
            while i < 32:
                if val[i] < target[i]:
                    break
                i += 1

            while i < 32:
                result = (result << 1) + target[i] - val[i]
                i += 1

            return result

        n = len(nums)
        for i in range (n):
            nums[i] = to_bit_array(nums[i])
           
        target = [0] * 32
        for bit_number in range (32):
            # Thử tăng bit trong đáp án lên 1
            target[bit_number] = 1

            # Đếm số lần cộng để từng phần tử có thể đưa vào subset
            necessary_ops = [0] * n
            for i in range (n):
                necessary_ops[i] = count_ops(nums[i], target)

            # Kiểm tra xem có thể chọn m phần tử không
            necessary_ops.sort()
            if sum(necessary_ops[:m]) > k:
                # Không thỏa mãn, đặt lại bit trong đáp án về 0
                target[bit_number] = 0

        return to_int(target)
 
Solution Q4 cuối cùng của tui vẫn mất 11000ms. May là Leetcode thoáng, chứ giới hạn 2-3s như Codeforce thì không qua nổi câu này :D
Python:
class Solution:
    def maximumAND(self, nums: List[int], k: int, m: int) -> int:
        # Chuyển số thành mảng bit
        def to_bit_array(val):
            arr = []
            for i in range (32):
                arr.append(val%2)
                val >>= 1
            return arr[::-1]

        # Chuyển mảng bit thành số
        def to_int(arr):
            num = 0
            for bit in arr:
                num <<= 1
                num += bit
            return num

        # Đếm số lần cộng để (val & target) == target
        def count_ops(val, target):
            result = 0
            i = 0
            while i < 32:
                if val[i] < target[i]:
                    break
                i += 1

            while i < 32:
                result = (result << 1) + target[i] - val[i]
                i += 1

            return result

        n = len(nums)
        for i in range (n):
            nums[i] = to_bit_array(nums[i])
          
        target = [0] * 32
        for bit_number in range (32):
            # Thử tăng bit trong đáp án lên 1
            target[bit_number] = 1

            # Đếm số lần cộng để từng phần tử có thể đưa vào subset
            necessary_ops = [0] * n
            for i in range (n):
                necessary_ops[i] = count_ops(nums[i], target)

            # Kiểm tra xem có thể chọn m phần tử không
            necessary_ops.sort()
            if sum(necessary_ops[:m]) > k:
                # Không thỏa mãn, đặt lại bit trong đáp án về 0
                target[bit_number] = 0

        return to_int(target)
Q4 của mình cũng loằng ngoằng mà có 600ms, nhưng tính ra vẫn NlogN hay N*32 thì phải.
Ý tưởng là build từ bit i lớn -> bé:
  • Nếu hiện tại có >= M số với bit i thì lấy tất
  • Nếu không thử lấy k bù cho các số còn lại từ lớn đến bé
Python:
class Solution:
    def maximumAND(self, arr: List[int], K: int, M: int) -> int:
        def dfs(A, bit, k):
            if len(A) < M or k <= 0 or bit < 0:
                return 0
            mod = 1 << bit
            N = len(A)
            A.sort(reverse=True)
            cnt = 0
            for n in A:
                cnt += n >> bit & 1
            new_A = []
            if cnt >= M:
                for n in A:
                    if n >= mod:
                        new_A.append(n % mod)
                return dfs(new_A, bit-1, k) + mod
            new_k = k
            for n in A:
                if n >= mod:
                    new_A.append(n % mod)
                if n < mod:
                    new_A.append(0)
                    new_k -= mod - n
                if len(new_A) == M:
                    break
            if new_k >= 0:
                return mod + dfs(new_A, bit-1, new_k)
            else:
                new_A = []
                for n in A:
                    new_A.append(n % mod)
                return dfs(new_A, bit-1, k)
        return dfs(arr, 31, K)
 
em mới tập tành contest, theo các bác có nên resolve những contest đầu từ 2016 không nhỉ?
 
osCpCsi.png
Cày 1 tháng lên full 4 bài thì kinh dị quá bác ơi
 

Thống kê chủ đề

Ngày tạo
freedom.9,
Người trả lời cuối
deple20k,
Trả lời
1.686
Lượt xem
107.023
Quay lại
Lên đầu trang