Bài tập  /  Bài đang cần trả lời

 xin hãy giúp fj xác định số lượng tối đa của con bò mà ông có đủ khả năng để tặng quà

nông dân john muốn tặng quà cho n(1<=n<=1000) con bò của ông và hiện tại ông có b(1<=b<=10^9) đơn vị tiền.

con bò thứ i yêu cầu một món quà với giá trị p[i],và chi phí vận chuyển của món quà này là s[i].fj có một phiếu giảm giá đặc biệt mà ông có thể sử dụng để đặt hàng một món quà của mình lựa chọn chỉ bằng một nửa giá bình thường của nó.nếu fj sử dụng phiếu giảm giá cho con bò i,thì ông chỉ cần phải trả tiền p[i]/2+s[i] cho món quà của con bò đó.để thuận tiện thì p[i] luôn là các số chẵn.

 xin hãy giúp fj xác định số lượng tối đa của con bò mà ông có đủ khả năng để tặng quà.

Input:

*Dòng1:Hai số nguyên tách biệt n và b

*Dòng2…1+n:Dòng i+1 chứa hai số nguyên tách biệt p[i],s[i] (0<=p[i],s[i]<=10^9,p[i] chẵn)

Output:

*Dòng1:Số lượng tối đa của con bò cho người nông dân có thể mua quà tặng
 

1 trả lời
Hỏi chi tiết
56
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Để giải quyết bài toán này, ta cần xác định số lượng tối đa bò mà nông dân John có thể tặng quà với ngân sách b mà ông có. Bài toán có một yếu tố đặc biệt là ông có thể sử dụng một phiếu giảm giá cho một món quà của con bò nào đó để giảm giá nó xuống một nửa.

### Cách tiếp cận:

1. **Tính toán chi phí**: Đối với mỗi con bò, chúng ta sẽ tính hai loại chi phí:
- **Chi phí mà không sử dụng phiếu giảm giá**: `cost_without_coupon[i] = p[i] + s[i]`
- **Chi phí khi sử dụng phiếu giảm giá**: `cost_with_coupon[i] = p[i] / 2 + s[i]`

2. **Sắp xếp**: Ta sẽ sắp xếp danh sách các chi phí để có thể chọn tiêu tốn ngân sách vào các bò sao cho tối đa số lượng bò được tặng. Nếu không sử dụng phiếu giảm giá cho một con bò, chúng ta sẽ chọn con có chi phí thấp nhất trước.

3. **Tính toán số bò tối đa**:
- Lần lượt cộng dồn chi phí từ chi phí thấp đến cao cho cả hai trường hợp (có và không có phiếu giảm giá).
- Cần kiểm tra cả hai trường hợp:
1. Không dùng phiếu giảm giá cho con bò nào và tính xem bao nhiêu con bò có thể tặng.
2. Dùng phiếu giảm giá cho từng con bò, tính lại chi phí và xem có thể tặng thêm nhiều bò hơn không.

### Ví dụ chi tiết:

1. **Input**:
```
n = 3, b = 10
p = [4, 6, 8]
s = [1, 2, 3]
```

2. **Tính chi phí cho mỗi con bò**:
```
cost_without_coupon = [4 + 1, 6 + 2, 8 + 3] = [5, 8, 11]
cost_with_coupon = [4 / 2 + 1, 6 / 2 + 2, 8 / 2 + 3] = [3, 5, 7]
```

3. **Sắp xếp chi phí**:
```
Chi phí không có giảm giá (sắp xếp): [5, 8, 11]
Chi phí có giảm giá (sắp xếp): [3, 5, 7]
```

4. **Tính số bò tối đa**:
- Nếu không dùng phiếu giảm giá, kiểm tra từ chi phí thấp nhất:
- Tặng bò đầu tiên (5), còn 5.
- Tặng bò thứ hai (8), không đủ tiền --> Có 1 bò.
- Nếu dùng phiếu giảm giá cho từng bò, lặp lại như vậy và kiểm tra ngân sách.

### Mã giả thuật (Pseudo-code):

```python
n, b = map(int, input().split())
goods = []
for i in range(n):
p, s = map(int, input().split())
goods.append((p, s))

# Tính chi phí
costs_normal = [(p + s) for (p, s) in goods]
costs_discounted = [(p // 2 + s) for (p, s) in goods]

# Sort the costs
costs_normal.sort()
costs_discounted.sort()

max_cows = 0

# Chưa sử dụng phiếu giảm giá
total_cost = 0
for i in range(n):
total_cost += costs_normal[i]
if total_cost > b:
break
max_cows += 1

# Dùng phiếu giảm giá cho từng bò một và kiểm tra
for i in range(n):
total_cost = costs_discounted[i] # Sử dụng phiếu cho bò i
count = 1 # Bò i được tặng
for j in range(n):
if j == i:
continue
total_cost += costs_normal[j]
if total_cost > b:
break
count += 1
max_cows = max(max_cows, count)

print(max_cows)
```

### Đầu ra:
Chương trình trên sẽ in ra số lượng tối đa các con bò mà nông dân John có thể tặng quà.
1
0
Tuấn Phạm
31/08 12:34:31
+5đ tặng
MÃ PYTHON:
def max_gifts(n, b, costs):
    normal_costs = [p + s for p, s in costs]
    discounted_costs = [p // 2 + s for p, s in costs]
   
    normal_costs.sort()

    total_cost = 0
    max_cows = 0

    for i in range(n):
        total_cost += normal_costs[i]
        if total_cost <= b:
            max_cows = i + 1
        else:
            break

    for i in range(n):
        discounted_total_cost = total_cost - normal_costs[i] + discounted_costs[i]
        if discounted_total_cost <= b:
            max_cows = max(max_cows, max_cows)
            break

    return max_cows


n, b = map(int, input().split())
costs = [tuple(map(int, input().split())) for _ in range(n)]

print(max_gifts(n, b, costs))



CÁCH TIẾP CẬN:
  1. Xác định chi phí không sử dụng phiếu giảm giá: Đối với mỗi con bò, chi phí sẽ là p[i]+s[i]\text{p[i]} + \text{s[i]}p[i]+s[i].

  2. Xác định chi phí sử dụng phiếu giảm giá: Nếu sử dụng phiếu giảm giá cho con bò thứ i, chi phí sẽ là p[i]/2+s[i]\text{p[i]}/2 + \text{s[i]}p[i]/2+s[i].

  3. Tạo hai danh sách:

    • Danh sách đầu tiên chứa chi phí không sử dụng phiếu giảm giá.
    • Danh sách thứ hai chứa chi phí khi sử dụng phiếu giảm giá (lưu ý rằng chỉ sử dụng phiếu giảm giá cho một con bò duy nhất).
  4. Sắp xếp chi phí tăng dần: Để tối đa hóa số lượng quà tặng, ta cần sắp xếp danh sách chi phí tăng dần và tính toán tổng chi phí tích lũy.

  5. Kiểm tra từng trường hợp: Với mỗi con bò i, thử sử dụng phiếu giảm giá cho nó và xem liệu tổng chi phí có vượt quá số tiền b hay không. Nếu không, lưu lại số lượng con bò tối đa.

Mở khóa để xem toàn bộ nội dung trả lời

(?)
Bạn đã đạt đến giới hạn của mình. Bằng cách Đăng ký tài khoản, bạn có thể xem toàn bộ nội dung trả lời
Cải thiện điểm số của bạn bằng cách đăng ký tài khoản Lazi.
Xem toàn bộ các câu trả lời, chat trực tiếp 1:1 với đội ngũ Gia sư Lazi bằng cách Đăng nhập tài khoản ngay bây giờ
Tôi đã có tài khoản? Đăng nhập

Bạn hỏi - Lazi trả lời

Bạn muốn biết điều gì?

GỬI CÂU HỎI
Học tập không giới hạn cùng học sinh cả nước và AI, sôi động, tích cực, trải nghiệm

Hôm nay bạn thế nào? Hãy nhấp vào một lựa chọn, nếu may mắn bạn sẽ được tặng 50.000 xu từ Lazi

Vui Buồn Bình thường

Học ngoại ngữ với Flashcard

×
Gia sư Lazi Gia sư
×
Trợ lý ảo Trợ lý ảo