n 部電影,k 名學生。每部電影有開始/結束時間、女演員數。學生看電影需滿足:時間不衝突(下一部開始 ≥ 上一部結束),女演員數不減。求最多能看多少部電影,輸出 0/1 序列表示選擇方案,多解取字典序最小。
X_i, Y_i。i 可接在 j 後(b_j ≤ a_i 且 c_j ≤ c_i),加邊 X_j → Y_i。k,則可行。按電影編號 1..n 處理:
i,構建當前圖的匹配。k),強制作為新路徑起點(輸出 1)。此貪心保證字典序最小,因為優先保留編號小的電影。
bool ok(int x, int y) { // y 可接在 x 後
return b[x] <= a[y] && c[x] <= c[y];
}
int solve() { // 當前圖的最大匹配
memset(lef, -1, sizeof lef);
int ans = 0;
for (int i = 1; i <= n; ++i) if (!del[i]) {
memset(T, 0, sizeof T);
if (match(i)) ++ans;
}
return ans;
}
int main() {
while (~scanf("%d%d", &n, &k)) {
// 讀入、構建邊
int delnum = 0;
for (int i = 1; i <= n; ++i) {
// 加入邊 i→j, j k) { del[i] = 1; delnum++; ok_add = false; }
printf("%d", ok_add);
}
puts("");
}
}
關鍵:每次只需在現有匹配基礎上增量嘗試合併新節點,複雜度可接受。