首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

UVA 11134 Fabled Rooks:優先隊列貪心解決車的放置問題

     編輯:關於C++

問題重述

N×N 棋盤,放 N 個車(Roak),互不攻擊(每行每列恰好一個)。第 i 個車只能放在矩形 [lx_i, rx_i] × [ly_i, ry_i] 內。求任意可行放置方案或判定無解。

關鍵分解:X/Y 獨立

車不攻擊 ⇔ 所有車的 x 坐標互不相同,y 坐標互不相同。
x、y 兩維度**完全獨立**,可分別求解!
問題轉化為:在 1 維線上,有 N 個區間 [l_i, r_i],每個區間選一個整點,所有選點互不相同。這是經典**區間調度/貪心**問題。

貪心策略:優先隊列 + 掃描線

  1. 按左端點 l 將區間分桶:bucket[l] 存所有 l_i = l 的區間索引。
  2. 掃描坐標 x = 0..N-1:
     a. 將 bucket[x] 所有區間加入**最小堆**,按右端點 r 排序。
     b. 若堆為空或堆頂 r < x → 無解。
     c. 彈出堆頂區間,分配坐標 x 給它。

完整求解流程


bool solve1D(int* l, int* r, int* ans) {
    vector bucket[N];
    for (int i=0;i, vector>, greater<>> pq;
    for (int x=0; x

正確性證明

經典「最早截止時間優先」貪心:當前坐標 x 必須分配給某個覆蓋 x 的區間。選擇 r 最小的區間,為後續留出最大餘地。交換論證可證最優。

複雜度

排序/分桶 O(N),堆操作 O(N log N),總 O(N log N),N ≤ 5000 輕鬆通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved