# 資料結構題 - 切割費用 - APCS - by Peter Wang
## 題目資訊
此題為2021.1 測驗中的題目3
###### tags: `APCS`
## 題目敘述
有一根長度為 L 的棍子,你會把這個棍子切割 n 次。
假設一開始棍子左端放在數線上 0 的位置,棍子的右端放在數線上 L 的位置,每次的切割會給定一個介於 0 到 L 的數字表示要切個的位置,你要把穿過個這位置的棍子切成兩段,而所需的花費就等於所切割的棍子的長度。
### 輸入:
第一行有兩個整數 n,L。
接下來 n 行每行有兩個整數 x,i,表示 x 位置被切過一刀,而這刀是全部的切割中的第 i 刀,保證 i 是介於 [1,n] 的整數且不會重複。
### 輸出:
輸出一個整數表示總共的切割費用。
## 解題思路
利用set自動排序的特性,以及stl upper_bound的應用來完成此題。
如果有需要請觀看[upper_bound](https://hackmd.io/@PeterWang/B1ZKdjGlF)介紹。
## 程式碼
```clike=
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int n,l;
vector <pair<int,int>> knife;
bool cmp(pair<int,int> a,pair<int,int> b){
return a.second<b.second;
}
int main() {
while(cin>>n>>l){
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
knife.push_back({a,b});
}
sort(knife.begin(),knife.end(),cmp);
long long ans=0;
set <int> count;
count.insert(0);
count.insert(l);
for(int i=0;i<n;i++){
count.insert(knife[i].first);
auto it=count.upper_bound(knife[i].first);
it--;
ans += *next(it)-*prev(it);
}
cout<<ans<<endl;
}
}
```
## 資料來源
[zerojudge](https://zerojudge.tw/)
[題目敘述](https://zerojudge.tw/ShowProblem?problemid=f607)
## 備註
>[name=PeterWang]
>[time=Thu, Aug 12, 2021 8:29 PM]