题号:1230
一开始想排完序之后直接从前到后由时间1到时间n依次安排,这样做是不对的。
完全可以从一个任务的截止时间开始从后往前安排,哪里有空缺位置就放在那里。
一开始的想法忽略了其他任务也可以放在前面。(说的不太清楚)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include<iostream> #include<algorithm> using namespace std; int m, n; struct s{ int t; int w; bool operator < (s & s1){ if (w != s1.w)return w>s1.w; else return t < s1.t; } }arr[505]; bool occupied[505]; int main(){ ios::sync_with_stdio(false); cin >> m >> n; for (int i = 1; i <= n; i++){ cin >> arr[i].t; } for (int i = 1; i <= n; i++){ cin >> arr[i].w; } sort(arr + 1, arr + n + 1); for (int i = 1; i <= n; i++){ if (!occupied[arr[i].t])occupied[arr[i].t] = true; else{ bool flag = false; for (int j = arr[i].t - 1; j >= 1;j--){ if (!occupied[j]){ occupied[j] = true; flag = true; break; } } if (!flag)m -= arr[i].w; } } cout << m; } |