N 份作業 (N ≤ 1000),每份有截止天數 deadline 和逾期扣分
score 降序排序 (分數相同按 deadline 升序)。used[day] 標記該天是否已安排作業。min(deadline, N) 向前找第一個未用的天。#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
struct HW { int deadline, score; } hw[MAXN];
bool used[MAXN];
int main() {
int T; scanf("%d", &T);
while (T--) {
int n; scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &hw[i].deadline);
for (int i = 0; i < n; i++) scanf("%d", &hw[i].score);
sort(hw, hw+n, [](const HW& a, const HW& b) {
return a.score != b.score ? a.score > b.score : a.deadline < b.deadline;
});
fill(used, used+n+1, false);
int ans = 0;
for (int i = 0; i < n; i++) {
int day = min(hw[i].deadline, n);
while (day > 0 && used[day]) day--;
if (day > 0) used[day] = true;
else ans += hw[i].score;
}
printf("%d\n", ans);
}
return 0;
}
若作業有耗時 (非單位時間),則為經典「調度問題」,需用 DP 或優先隊列。本題單位時間貪心最優。