acm-icpc live archive
這道題搞了我兩天,最終還是搞出來了!
很容易就可以發現這題是二分,不過二分後怎麼貪心就稍微有點難想了。貪心的方法其實很簡單,就是盡量先把結束的早的任務先盡早的完成了。如果在給定的處理器速度下不能完成所有任務,那麼這個速度就還不夠。
我的方法是用線段樹填充盡量靠左的填充沒利用的速度,根據能夠填充的量,判斷貪心是否能夠做到。
**如下:
view code
1這題還可以用優先佇列的方法來做,具體**將盡快更新。#define rep(i, n) for (int i = 0; i < (n); i++)23
#define lson l, m, rt << 1
4#define rson m + 1, r, rt << 1 | 156
struct
task
10 task(int _l, int
_r, ll _w) : l(_l), r(_r), w(_w) {}
11bool
operator
< (const task &x) const
15} task[n];
16 ll rest[m << 2], buf[m << 2
];17
18void up(int
rt)
2122
void down(int
rt) 32}
3334
void build(ll val, int l, int r, int
rt)
40int m = (l + r) >> 1;41
build(val, lson);
42build(val, rson);
43up(rt);44}
4546 ll update(ll val, int l, int r, int l, int r, int
rt)
54int m = (l + r) >> 1;55
down(rt);
56if (l <=m)
61 } else
if (m
64up(rt);
65return
ret;66}
6768
intml, mr;
6970
void input(int
n) 81 sort(task, task +n);82}
8384
bool test(ll x, int
n) 90
return
true;91
}9293 ll work(int
n) 100
return
mk;101
}102
103int
main()
110return0;
111 }
upd:
用多重集來代替優先佇列,**如下:
view code
1——written by lyon#define mset multiset
2#define itor iterator
3#define rep(i, n) for (int i = 0; i < (n); i++)
45 typedef pairpii;
6 typedef vectorvpii;78
intr[n], d[n];
9bool
vis[n];
10ll w[n];
11vpii timemark;
1213
void input(int
n) 20
sort(all(timemark));21}
2223
ll rest[n];
24 msetontask;
2526
bool test(int x, int
n) else
40while (true
) 49}50
}51 rep(i, n) if (rest[i]) return
false;52
return
true;53
}5455int work(int
n) 62
return
mk;63}64
65int
main()
73return0;
74 }
LA4254 二分 貪心 優先佇列
題目 有n個任務,每個任務有三個引數ri,di,wi,表示任務i必須在 ri,di 內執行完,現有一台處理器,處理器執行的速度可以變化,速度為s時,乙個工作量為wi的任務執行的時間為w s,任務不一定連續執行,現在要求求出處理器在執行過程中最大速度的最小值。分析 首先一定是個二分,所以主要的地方在於...
LA 4254 處理器(二分 貪心)
題意 有n個任務,每個任務有3個引數ri,di和wi,表示必須在時刻 ri,di 之內執行,工作量為wi。處理器的速度可以為任意值,任務不一定要連續執行,可以分成若干塊,求最大速度的最小值。思路 最大值的最小值問題可以考慮用二分法來做。這道題目怎麼判斷速度合法是關鍵,我們可以使用秒為單位來判斷。計算...
Processor 二分搜尋,優先佇列
題意 給出n個任務完成區間以及工作量,求出最快處理速度.思路 用二分搜尋匹配最優速度,其中還用到優先佇列輔助.列舉所有截止時間,在此時間內的都進隊,按照工作截止時間越早越先出隊,如果截止時間不及列舉的截止時間,則錯過 include include include include includeus...