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