【模拟】P1563 玩具谜题
生活随笔
收集整理的這篇文章主要介紹了
【模拟】P1563 玩具谜题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.luogu.com.cn/problem/P1563
考點:模擬、高性能
題意:
題目太長,就不全貼了。大意是有n個玩具小人圍成一個圈,可能朝向圈內或圈外。接下來m條指令指引我們找到最終的小人。指令告訴我們要往左邊走s步或者往右邊走s步。
我這里說的很籠統,具體朝內朝外向左向右還是得去看原題。
解法:
這個題用暴力會超時,主要考的就是如何用取余來代替暴力循環。
首先用一個vector存n個玩具小人的位置和名字
然后讀取過程中我把代表朝向圈內的0改成了-1來存儲,同樣的道理我把代表向左的0改為-1。這樣處理就可以用朝向*前進方向來表示下標的增加或減小,積為-1可能是朝內向右走或者朝外向左走,下標是增加的;積為1同理,下標減小。
最后要用取余運算取代暴力循環,比較簡單,沒什么解釋的,上代碼。
#include <bits/stdc++.h> using namespace std; using PSI = pair<string, int>; int main() {int n,m; cin >> n >> m;vector<PSI> v(n);for (int i = 0; i < n; i++) { // 逆時針cin >> v[i].second; // 0朝向圈內 1朝向圈外if (v[i].second == 0) v[i].second = -1; // -1朝向圈內cin >> v[i].first; // 名字}int now = 0; // 第一個小人for (int i = 0; i < m; i++) {int dir, step; cin >> dir >> step;if (dir == 0) dir = -1; // -1左,1右step %= (n+1); // 不管走了多少步都可以這樣處理if (dir * v[now].second < 0) { // 朝內向右或朝外向左,即下標增長if (now + step < n) now += step;else if (now + step == n) now = 0;else {step -= n - now;now = 0;now += step;}} else { // 下標減少step次if (now - step > 0) now -= step;else if (now - step == 0) now = 0;else {step -= now;now = 0;now += n - step;}}}cout << v[now].first;return 0; }總結
以上是生活随笔為你收集整理的【模拟】P1563 玩具谜题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【模拟】P1067 多项式输出
- 下一篇: 【贪心】P1056 排座椅