题解 P6746 【『MdOI R3』Operations】.pas

囧仙

2020-08-08 21:16:07

Solution

## 题目大意 有两个非负整数 $a,b$ ,使用两种操作将它们都变成 $0$ 。 1. 两个数同时减去正整数 $x$ 。 2. 一个数乘以正整数 $x$ ,另一个数除以 $x$ 并下取整。 ## 题解 提供一个 $\text{Pascal} $ 版本的题解,共大家参考。 题面操作简单,但似乎并不那么容易写。先让我们从题目给出的部分分入手。 - $\textbf{Subtask 1}:a=b=0$ 显然,我们只要输出 $0$ 即可。 - $\textbf{Subtask 2}:a=0$ 使用操作 $2$ 。显然,$0$ 乘以任何数都为 $0$ 。于是,我们让 $a$ 乘以一个很大的正整数(比如 $10^{18}$) ,$b$ 除以 $x$ 下取整后自然变成了 $0$ 。 - $\textbf{Subtask 3\& 5}:a=b$ 这种情况下,我们可以仅使用一次 $c$ 操作让 $a,b$ 变成 $0$ 。 - $\textbf{Subtask 7}:\text{无特殊限制}$ 首先,我们能够通过操作 $1$ **或者** $2$ 将一个数变成 $0$ 。这时就化归成了 $\text{Subtask 2}$ 的情形,即再花费 $d$ ,来将另外一个数变成 $0$ 。 结果只要取上述符合条件下所有情况的最小值即可。 关于 $\text{Pascal}$ 的条件语句,它的一般格式为`if 条件 then 支路1;` 或者 `if 条件 then 支路1 else 支路2 ;` 。如果某个支路内有多个操作,需要用 `begin end` 进行嵌套。 由于该题中条件语句较为简单,因此代码写起来非常容易。 ## 参考代码 ```pascal uses math; var a,b,c,d,ans:longint; begin ans:=2147483647; read(a); read(b); read(c); read(d); if ((a=0) and (b=0)) then ans:=min(ans,0); if (a=b) then ans:=min(ans,c); if ((a=0) or (b=0)) then ans:=min(ans,d); ans:=min(ans,c+d); ans:=min(ans,2*d); writeln(ans); end. ```