Giả sử chúng ta có một danh sách các số được gọi là num có độ dài là n. Các yếu tố có trong danh sách này đại diện cho số điểm hiện tại của các vận động viên bơi lội trong một cuộc thi. Đối với trận đấu cuối cùng, người giành vị trí đầu tiên cho vòng hiện tại này sẽ nhận được n điểm, người giành vị trí thứ hai sẽ nhận được n-1 điểm, v.v. Chúng tôi phải kiểm tra số lượng vận động viên bơi lội còn có thể giành quyền thi đấu ở vòng chung kết sau vòng hiện tại. Nếu hòa cho điểm đầu tiên, điều đó cũng sẽ được tính là chiến thắng.
Vì vậy, nếu đầu vào là nums =[9, 6, 11, 12], thì đầu ra sẽ là 3, vì những vận động viên bơi lội hiện đang đạt điểm 9, 11 và 12, họ đều có thể giành chiến thắng nếu điểm cuối cùng là [13 , 9, 13, 13]. Tức là, vận động viên bơi 9 điểm đứng đầu nên được thêm 4 điểm, sau đó vận động viên bơi 6 điểm đứng thứ hai nên bây giờ số điểm là 9. Vận động viên bơi 11 điểm đứng thứ ba nên số điểm mới là 13, còn vận động viên bơi 12 điểm được vị trí cuối cùng nên số điểm cũng là 12. Nhưng ngay cả khi vận động viên bơi 6 điểm giành được vị trí đầu tiên thì điểm cuối cùng của anh ta sẽ là 10 điểm, vận động viên bơi lội 9 điểm về thứ hai thì số điểm của anh ta sẽ là 12, v.v. thì cũng không có cơ hội chiến thắng cho người bơi lội thứ hai.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- nếu nums trống, thì
- trả về 0
- n:=kích thước của nums
- ans:=0
- sắp xếp các số trong danh sách
- a:=0
- đối với tôi trong phạm vi n - 1 đến 0, giảm đi 1, thực hiện
- cand:=nums [i] + n - i
- nếu cand> a, thì
- a:=cand
- đối với mỗi x trong nums, thực hiện
- nếu x + n> =a, thì
- ans:=ans + 1
- nếu x + n> =a, thì
- trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def solve(nums): if not nums: return 0 n = len(nums) ans = 0 nums.sort() a = 0 for i in range(n - 1, -1, -1): cand = nums[i] + n - i if cand > a: a = cand for x in nums: if x + n >= a: ans += 1 return ans nums = [9, 6, 11, 12] print(solve(nums))
Đầu vào
[9, 6, 11, 12]
Đầu ra
3