Hãy xem xét câu hỏi Google Code Jam vòng 1C sau đây:
Vạn Lý Trường Thành của Trung Quốc bắt đầu như một đường thẳng vô tận, trong đó chiều cao ở tất cả các vị trí là .
Một số bộ lạc , , sẽ tấn công vào tường theo các thông số sau - ngày bắt đầu, , cường độ bắt đầu , tọa độ hướng tây bắt đầu, và tọa độ hướng đông bắt đầu, . Tấn công đầu tiên này xảy ra vào ngày , trên phạm vi , ở sức mạnh . Nếu có bất kỳ phần nào của Vạn Lý Trường Thành trong có chiều cao , cuộc tấn công thành công và vào cuối ngày, bức tường sẽ được xây dựng sao cho bất kỳ đoạn nào của nó trong chiều cao sau đó sẽ ở chiều caoN ≤ 1000 D S W E D [ W , E ] S [ W , E ] < S [ W , E ] < S S (hoặc lớn hơn, nếu một số cuộc tấn công khác vào ngày hôm đó đánh vào cùng phân khúc với sức mạnh )
Mỗi bộ lạc sẽ thực hiện tối đa cuộc tấn công trước khi rút lui và mỗi cuộc tấn công sẽ được xác định lặp đi lặp lại từ cuộc tấn công trước đó. Mỗi bộ lạc có một số , và xác định chuỗi tấn công của họ: Họ sẽ đợi ngày giữa các cuộc tấn công, họ sẽ di chuyển các đơn vị phạm vi tấn công cho mỗi cuộc tấn công ( = west, positive = đông), mặc dù kích thước của phạm vi sẽ giữ nguyên và sức mạnh của chúng cũng sẽ tăng / giảm theo một giá trị không đổi sau mỗi lần tấn công.δ D δ X δ S δ D ≥ 1 δ X
Mục tiêu của vấn đề là, được mô tả đầy đủ về các bộ lạc tấn công, xác định có bao nhiêu cuộc tấn công của họ sẽ thành công.
Tôi đã quản lý để mã hóa một giải pháp hoạt động được, chạy trong khoảng 20 giây: Tôi tin rằng giải pháp tôi đã triển khai mất thời gian , trong đó tổng số lần tấn công trong một mô phỏng (tối đa ) và tổng số điểm cạnh duy nhất trên phạm vi tấn công (tối đa ).
Ở cấp độ cao, giải pháp của tôi:
- Đọc tất cả thông tin của Bộ lạc
- Tính toán tất cả các tọa độ duy nhất cho phạm vi tấn công -
- Đại diện cho Tường dưới dạng cây nhị phân được cập nhật một cách lười biếng trên các phạm vi theo dõi các giá trị chiều cao tối thiểu. Một chiếc lá là khoảng của hai tọa độ không có gì ở giữa và tất cả các nút cha biểu thị khoảng thời gian liên tục được bao phủ bởi con cái của chúng. -
- Tạo tất cả các Tấn công mà mọi Bộ lạc sẽ thực hiện và sắp xếp chúng theo ngày -
- Đối với mỗi cuộc tấn công, hãy xem liệu nó có thành công không ( thời gian truy vấn). Khi ngày thay đổi, lặp qua tất cả các cuộc tấn công thành công chưa được xử lý và cập nhật tường phù hợp ( thời gian cập nhật cho mỗi cuộc tấn công). -
Câu hỏi của tôi là: Có cách nào tốt hơn không? Có lẽ, có một số cách chiến lược để tận dụng bản chất tuyến tính của các cuộc tấn công liên tiếp của Tribes? 20 giây cảm thấy quá dài cho một giải pháp dự định (mặc dù Java có thể đổ lỗi cho điều đó).