LQDOJ Contest #10 - Bài 4 - Chia Kẹo

Xem PDF

Điểm: 1200 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Vào ngày sinh nhật của LQDOJ, shiba - một thành viên của Team Shiba quyết định tặng kẹo cho các bạn trẻ trong trường. Có \(N\) đứa trẻ muốn được nhận kẹo và shiba có một bịch kẹo gồm \(M\) vị khác nhau. Có một điều khiến shiba phải băn khoăn rằng tất cả đứa trẻ muốn tất cả viên kẹo mà mình có đều phải có cùng một vị. shiba cũng biết rằng các bạn trẻ sẽ ghen tị nếu có một bạn được quá nhiều kẹo. Để giải quyết các điều này một cách êm đềm nhất, shiba quyết định chia kẹo sao cho mức độ ghen tị sẽ là nhỏ nhất có thể, biết rằng mức độ ghen tị là số kẹo nhiều nhất mà một bạn trẻ có được.

Ví dụ bịch kẹo của shiba\(7\) viên kẹo vị \(X\)\(4\) viên kẹo vị \(Y\) thì mà cần chia cho \(5\) đứa trẻ thì shiba có thể chia như sau: \(XX\),\(XX\),\(YY\),\(YY\),\(YYY\). Mức độ ghen tị lúc này là \(3\), là mức độ ghen tị nhỏ nhất có thể.

Tuy nhiên thực hiện việc chia kẹo là quá khó với shiba. Anh ấy nhờ các bạn lập trình tài năng của LQDOJ giúp shiba tìm cách chia sao cho mức độ ghen tị là nhỏ nhất có thể.

Yêu cầu: Bạn hãy giúp shiba tính mức độ ghen tị nhỏ nhất có thể. Biết rằng trường hợp có đứa trẻ không nhận được một viên kẹo nào là có thể xảy ra.

Input

  • Dòng đầu tiên chứa hai số nguyên dương lần lượt là \(N\)\(M\) \((1 \le N \le 10^9,1 \le M \le 3 \times 10^5, M \le N)\).
  • \(M\) dòng tiếp theo mỗi dòng chứa một số nguyên dương là số kẹo của từng vị mà shiba có. Số kẹo của từng vị nằm trong đoạn \([1;10^9]\).

Output

  • In ra kết quả bài toán sau khi thực hiện yêu cầu đề bài.

Scoring

  • Subtask \(1\) (\(20\%\) số điểm): Có \(N \le 25\).
  • Subtask \(2\) (\(80\%\) số điểm): Không có ràng buộc gì thêm.

Example

Test 1

Input
5 2
4
7
Output
3
Note

Ví dụ đã được giải thích ở trên.


Bình luận


  • 0
    trinhhcuongday    11:52 p.m. 16 Tháng 11, 2024

    ý tưởng tham khảo nè:
    chặt nhị phân nhé
    ban đầu cho l=1 và r =tổng các phần tử là số kẹo của tùng vị
    dùng 1 hàm kiểm tra là (số kẹo + k - 1)/ k với k là mức độ ghen tị
    đủ để chia cho n em thì r=mid-1, ngược lại là l=mid+1 cứ thế tìm và trả về giá trị nỏ nhất tìm được
    code tham khảo:

    include <bits/stdc++.h>

    using namespace std;

    bool check(vector<int> &keo, int n, long long maxn) {
    long long daco = 0;
    for (int candy : keo) {
    daco += (candy + maxn - 1) / maxn; // Tương đương ceil(candy / maxn)
    if (daco > n) return false; // Nếu vượt quá số trẻ, trả về false
    }
    return true;
    }

    long long nhonhat(vector<int> &keo, int n) {
    long long l = 1, r = accumulate(keo.begin(), keo.end(), 0LL);
    long long kq = r;

    while (l <= r) {
        long long mid = (l + r) / 2;
        if (check(keo, n, mid)) {
            kq = mid; // Cập nhật kết quả
            r = mid - 1;  // Thử mức ghen tị nhỏ hơn
        } else {
            l = mid + 1;  // Tăng mức ghen tị
        }
    }
    return kq;
    

    }

    int main() {
    int n, m;
    cin >> n >> m;
    vector<int> keo(m);
    for (int i = 0; i < m; i++) {
    cin >> keo[i];
    }
    cout << nhonhat(keo, n) << endl;
    return 0;
    }

    1 phản hồi

    • 2
      blinh    11:48 p.m. 9 Tháng 9, 2024 chỉnh sửa 6
      summary

      hint: sử dụng tìm kiếm nhị phân rồi xét kết quả
      vd:
      5 2
      4
      7
      sử dụng định lý dirichlet nếu
      -mức độ ghen tị là 3 thì ta có thể chia: AAA, A, BBB, BBB, B => thỏa
      -mức độ ghen tị là 4 thì ta có thể chia: AAAA, BBBB, BBB (còn dư 2 đứa :v) => loại => xét đến kết quả thấp hơn
      -mức độ ghen tị là 2 thì ta có thể chia: AA, AA, BB, BB (còn dư 3 cái kẹo còn lại) => loại => xét kết quả cao hơn

      CODE AC PYPY(PYTHON)
      a,b=map(int,input().split())
      ds=[]
      res=-1
      for i in range(b):ds.append(int(input()))
      l,r=1,int(max(ds))
      def check(n):
          ans=0
          for i in ds:
              t=i//n
              if t<i/n:t+=1
              ans+=t
          if ans<=a:return True
          else:return False
      while l<=r:
          mid=(l+r)//2
          if check(mid):
              res=mid
              r=mid-1
          else:l=mid+1
          #print(mid)
      print(res)
      

      • 0
        hien18086    3:04 p.m. 25 Tháng 8, 2024

        lý ra đề phải nói rõ có chia hết kẹo hay không chứ


        • 0
          nd24052009    7:23 a.m. 25 Tháng 5, 2024

          Ai cho mình xin ý tưởng bài này với ạ