# 演算法題 - 圓環出口 - APCS - by Peter Wang ## 題目資訊 此題為2020.7 測驗中的題目3 ###### tags: `APCS` lower bound` ## 題目敘述 有 n 個房間排成一個環,編號分別是 0 到 n−1。 房間之間有單向的路徑,編號 i 的房間可以走到編號 (i+1)modn的房間。 每次進入編號 i 的房間可以獲得 pi 個點數(最一開始待的房間也可以獲得點數)。 現在依序有 m 個任務,第 i 個任務需要蒐集到 qi 個點數。對於每次的任務,若一開始在編號 s 的房間,且走到編號 t 的房間時候可以蒐集到需要的點數,則完成這次任務後會停在編號 (t+1)modn 的房間。 一開始在編號 0 的房間,依據接收到 m 個任務,請求出完成第 m 個任務後會停在哪個編號的房間? ### 輸入: 第一行包含兩個正整數 n,m(1≤n≤200000,1≤m≤20000)。 第二行包含 n 個正整數 p0,p1,p2,…,pn−1,p 的總和不超過 109。 第三行包含 m 個正整數 q0,q1,q2,…,qm−1,qi 不會超過 p 的總和。 ### 輸出: 輸出一個非負整數表示最後停在哪個編號的房間 ## 解題思路 利用vector內建功能lower bound找出前綴,並算出位置,就能得到答案。 ## 程式碼 ```clike= #include <iostream> #include <vector> using namespace std; int n, m, p[200005]; vector <int> pre; int main() { cin >> n >> m; for (int i = 0, tot = 0; i < n; i++){ cin >> p[i]; tot += p[i]; pre.push_back(tot); } int s = 0; for (int i = 0, q; i < m; i++){ cin >> q; if (s != 0) q += pre[s-1]; if (q > pre[n-1]) q -= pre[n-1]; s = (int)(lower_bound(pre.begin(), pre.end(), q)-pre.begin())+1; s %= n; } cout << s << endl; } ``` ## 資料來源 [zerojudge](https://zerojudge.tw/) [題目敘述](https://zerojudge.tw/ShowProblem?problemid=f581) ## 備註 >[name=PeterWang] >[time=Sat, Aug 7, 2021 9:25 PM]