正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-S 2021 第一轮真题 › 第37题
CSP-S 2021 第一轮 第37题:完善程序(第 19 题)第 4 空
题目
(1) (魔法数字) 小 H 的魔法数字是 $4$。给定 $n$, 他希望用若干个 $4$ 进行若干次加法、减法和整除运算得到 $n$。但由于小 H 计算能力有限,计算过程中只能出现不超过 $M = 10000$ 的正整数。求至少可能用到多少个 $4$。
例如,当 $n=2$ 时,有 $2=\dfrac{4 + 4}{4}$,用到了 $3$ 个 $4$,是最优方案。
试补全程序。
#include <iostream>
#include <cstdlib>
#include <climits>
using namespace std;
const int M = 10000;
bool Vis[M + 1];
int F[M + 1];
void update(int &x, int y) {
if (y < x)
x = y;
}
int main() {
int n;
cin >> n;
for (int i = 0; i <= M; i++)
F[i] = INT_MAX;
①;
int r = 0;
while (②) {
r++;
int x = 0;
for (int i = 1; i <= M; i++)
if (③)
x = i;
Vis[x] = 1;
for (int i = 1; i <= M; i++)
if (④) {
int t = F[i] + F[x];
if (i + x <= M)
update(F[i + x], t);
if (i != x)
update(F[abs(i - x)], t);
if (i % x == 0)
update(F[i / x], t);
if (x % i == 0)
update(F[x / i], t);
}
}
cout << F[n] << endl;
return 0;
}本小题
④处应填( )
选项
- A. F[i] < F[x]
- B. F[i]<=r
- C. Vis[i]
- D. i <= x
答案
C
题解
选 C. Vis[i]。
这里采用类似 Dijkstra 的思路:
F[i]表示得到数字i所需的最少的4的个数。Vis[i]表示数字i的最优答案已经确定。- 每轮选出尚未确定答案、且
F[x]最小的数字x,标记Vis[x] = 1。
接下来,要把 x 和已经确定最优答案的数字 i 组合起来,进行加、减、整除运算。两部分使用的 4 的总数为: ``cpp int t = F[i] + F[x]; ` 所以④应填: `cpp if (Vis[i]) ``
特别注意,刚刚标记过 Vis[x] = 1,因此允许 i = x。例如一开始由 4 + 4 得到 8,由 4 / 4 得到 1,都需要把 4 与自身组合。选项 A 的严格小于会漏掉这种情况。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号