日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【模拟】P1563 玩具谜题

發(fā)布時(shí)間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【模拟】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è)玩具小人的位置和名字

using PSI = pair<string, int>; vector<PSI> v(n);

然后讀取過(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。