---
# System prepended metadata

title: 演算法題 - 圓環出口 - APCS - by Peter Wang
tags: [APCS]

---


# 演算法題 - 圓環出口 - 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]