【2017 CCPC 秦皇島】A.Balloon Robot 思維
阿新 • • 發佈:2020-10-21
題意
現在正在舉行一場程式設計競賽,有 n 個選手,一張有 m 個座位的圓形桌子。現在給出 n 個隊伍坐的位置,以及 p 個正確的提交,每個提交給出某隊伍在某小時ac了一道題目。
現在有個機器人專門給ac的隊伍發氣球,假如他初始位置在 1.
它會依次執行以下步驟:
- 假如當前位置為 \(pos\) ,\(pos\)變為\(pos\%m+1\),即向後走一步
- 如果當前位置此時有未發的氣球,那麼給這個隊伍一個氣球。
對於每個隊伍,假如它ac某題的時間為 \(t_1\),收到氣球的時間為 \(t_2\),他會產生一個不開心值 \(t_2-t_1\)。
現在讓你選定一個機器人的初始位置,使得所有隊伍的總不開心值最小。
思路
首先我們求出來機器人在位置 \(1\) 時,每個隊伍的不開心度 \(val[i]\)。
我們來看當初始位置從 \(1\) 挪到 \(2\) 的時候每個隊伍不開心度的變化。
開心度為 \(0\) ,那麼會變成 \(m-1\),如果開心值不為 \(0\) ,那麼會減少 \(1\)。
但是 \(m\) 這麼大,肯定不能列舉所有的位置。
我就想應該是列舉 \(p\) 個ac,對於第 \(i\) 個ac,我們假設起點 \(x\) 滿足第 \(i\) 個ac的不開心值為 \(0\)。
得到起點 \(x\) 之後,假設以 \(1\) 為初始位置的位於區間 \([0,x-1]\) 的不開心值的個數有 \(num\)
得到的新的不開心值和 和以 \(1\) 為開始的不開心值和取小值即可。
程式碼
/* * @Autor: valk * @Date: 2020-08-21 11:06:28 * @LastEditTime: 2020-10-21 20:22:14 * @Description: 如果邪惡 是華麗殘酷的樂章 它的終場 我會親手寫上 晨曦的光 風乾最後一行憂傷 黑色的墨 染上安詳 */ #include <algorithm> #include <iostream> #include <map> #include <math.h> #include <queue> #include <set> #include <stack> #include <stdio.h> #include <string.h> #include <string> #include <vector> #define emplace_back push_back #define pb push_back using namespace std; typedef long long ll; typedef unsigned long long ull; const ll mod = 1e9 + 7; const ll seed = 12289; const double eps = 1e-6; const ll inf = 0x3f3f3f3f; const ll N = 2e5 + 10; ll pos[N], val[N]; struct note { ll pos, t, val; } arr[N]; int main() { int T; scanf("%d", &T); while (T--) { ll n, m, p; scanf("%lld%lld%lld", &n, &m, &p); for (ll i = 1; i <= n; i++) { scanf("%lld", &pos[i]); } ll sum = 0; for (ll i = 1; i <= p; i++) { scanf("%lld%lld", &arr[i].pos, &arr[i].t); arr[i].pos = pos[arr[i].pos]; val[i] = ((arr[i].pos - 1 - arr[i].t) % m + m) % m; arr[i].val = val[i]; sum += val[i]; } sort(val + 1, val + 1 + p); ll ans = sum; for (ll i = 1; i <= p; i++) { if (!arr[i].val) continue; ll now = ((arr[i].pos - arr[i].t + m) % m - 1 + m) % m;//得到使得該ac,不開心值為0的初始位置的移動次數 ll num = upper_bound(val + 1, val + 1 + p, now - 1) - val - 1; ll temp = sum - now * p + num * m; ans = min(ans, temp); } printf("%lld\n", ans); } return 0; }