{ "type": "code_options", "author": "csdn.net", "source": "solution.md", "exercise_id": "13364b60933343cf82bdee276b57df98", "keywords": "动态表,表扩张,算法中阶,摊还分析,高级设计和分析技术", "title": "报数游戏", "desc": [ { "content": "\n

题目描述
报数游戏\n首先,会给他们一人一个编号,并且每个人的编号都不相同。接下来的每一回合,会给一个数,编号超过它的最小编号的人要报出自己的编号。如果没有人的编号比给出的数要大,那么编号最大的人要报出自己的编号。每个人可以重复报号。\n会按照一个列表顺次报出每个回合的数,朋友们想知道每回合报出的编号应该是多少。\n输入
输入数据共 3 行。\n第一行有两个整数 n,m(1≤n≤100,000,1≤m≤100,000),分别表示参与游戏的朋友的个数,和游戏的回合数。 \n第二行 n个整数 ai(1≤ai≤100,000,000),表示朋友们每个人的编号。对于 0≤i<j<n,都有 ai<aj,即他们的编号递增排列。 \n第三行 m 个整数 qi(1≤qi≤100,000,000),表示每回合给的数字。\n输出
\n输出共一行 m 个整数,表示每回合报出的编号,每两个整数之间一个空格,最后一个数后面没有空格。

", "language": "markdown" } ], "answer": [ { "content": "", "language": "cpp" } ], "prepared": [ [ { "content": "", "language": "cpp" } ], [ { "content": "", "language": "cpp" } ], [ { "content": "", "language": "cpp" } ] ], "template": { "content": "#include\n#include\n#include\n#include\nusing namespace std;\nint ai[100010], qi[100010];\nint main()\n{\n\tint a, q;\n\twhile (cin >> a >> q)\n\t{\n\t\tfor (int i = 0; i < a; i++)cin >> ai[i];\n\t\tfor (int i = 0; i < q; i++)cin >> qi[i];\n\t\tfor (int i = 0; i < q; i++) {\n\t\t\tint left = 0, right = a - 1, mid;\n\t\t\twhile (left < right) {\n\t\t\t\tmid = (left + right) >> 1;\n\t\t\t\tif (ai[mid] <= qi[i])left = mid + 1;\n\t\t\t\telse right = mid;\n\t\t\t}\n\t\t\tif (left - 1 < 0 || ai[left] < qi[i])left++;\n\t\t\ti ? cout << \" \" << ai[left - 1] : cout << ai[left - 1];\t\t\t\n\t\t}\n\t\tcout << endl;\n\t}\n\treturn 0;\n}", "language": "cpp" }, "node_id": "dailycode-707a9a26d46749e9a9e2dde825d0421c", "license": "csdn.net", "created_at": 1637894158, "topic_link": "https://bbs.csdn.net/topics/600469965" }