---
# System prepended metadata

title: Greedy

---

# Greedy

是一個非常直觀的的演算法
每次都取最好的方法，前提是要先確保他會是對的，大多複雜度都不會太爛，$O(N)$，$O(NlogN)$
`Greedy`的題目大多都可以用`DP`來解，反過可能不行

## [a075]([https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a075])
就維護前綴和，再去遍歷每一個人就可以了

:::spoiler  `虛擬碼`
```cpp=
child_right <- 1
sum <- 0
val() // get the ith students value
FOR child_left in (1 to child_amount) :
	WHILE child_right in child and  val( child_right+1 ) + sum < K : //K 耐久度 :
		sum <- val( child_right+1 ) + sum;
		child_right <- child_right + 1
	
	sum <- sum - val( child_left )
	
```
:::

## [a076](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a076)

對於每個右界去做排序，依序取，判斷可行的區間，更新範圍，輸出答案

:::spoiler  `虛擬碼`
```cpp=
SORT( segments_right )
range <- (-inf, inf) //一開始的值域沒有範圍
ans <- 0
FOR segment in segments :
	IF segment in range :
		range <- [segment_right, inf)
		ans <- ans+1
	
```
:::

## [a078](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a078)

先對每一個作業依期限去做排序，對於每一個排序，放進完成的時間，如果完成的時間超過期限則每次取先前最大的完成時間

:::spoiler `虛擬碼`
```cpp=
SORT( homeworks.lim ) 
	
time_add() // 加入作業
time_cac() // 計算目前作業需要花的總時間 
time_cnt() // 計算有多少作業 
kick_max() // 把所花時間最多的作業踢出
FOR homework in homeworks :
	time_add(homework)
	WHILE time_cac() > homework.lim // IF 
		kick_max()
		
ans <- time_cac()
```
:::

## [a079](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a079)

一開始的每個人起始時間皆為0，然後每次去選取時間在最前面的人，依序放入即可


:::spoiler `虛擬碼`
```cpp=
worker.size = work_amount
worker_min(); //回傳最先可以服務顧客的那個員工，一開始都預設為0
worker_max(); //回傳所有員工中最後完成服務的那一個
FOR customer in Customers :
    worker_min() .time <- worker_min() .time + customer .time
   
ans <- worker_max();
```
:::

## [a080](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a080)
二分搜，判斷每一次的答案可不可以在時限內(透過`a079`的`greedy`)


:::spoiler `虛擬碼`
```cpp=
Function get_time( worker_amount ) :
    worker.size = worker_amount;
    worker_min(); //回傳最先可以服務顧客的那個員工，一開始都預設為0
    worker_max(); //回傳所有員工中最後完成服務的那一個
    FOR customer in Customers :
        worker_min() .time <- worker_min() .time + customer .time

    ans <- worker_max();
End Function

ans = use binary search find the max worker_amount let get_time( worker_amount )  lower that the limit
```
:::