现 在 假 设 n < = m 现在假设n<=m 现在假设n<=m
当 2 n < = m , 就 算 一 直 使 用 两 倍 的 m 仍 然 有 多 , 此 时 答 案 是 n 当2n<=m,就算一直使用两倍的m仍然有多,此时答案是n 当2n<=m,就算一直使用两倍的m仍然有多,此时答案是n
当 2 n > m 当2n>m 当2n>m
方 法 一 : 数 学 构 造 \color{Red}方法一:数学构造 方法一:数学构造
那 么 我 们 可 以 先 多 用 一 些 m , 也 就 是 每 次 消 耗 n 一 次 , 消 耗 m 两 次 那么我们可以先多用一些m,也就是每次消耗n一次,消耗m两次 那么我们可以先多用一些m,也就是每次消耗n一次,消耗m两次
消 耗 到 n 和 m 相 等 为 止 , 也 就 是 执 行 这 种 操 作 m − n 次 消耗到n和m相等为止,也就是执行这种操作m-n次 消耗到n和m相等为止,也就是执行这种操作m−n次
此 时 n 和 m 一 样 多 了 此时n和m一样多了 此时n和m一样多了
那 么 可 以 n 消 耗 两 次 , m 消 耗 一 次 。 紧 接 着 n 消 耗 1 次 , m 消 耗 两 次 那么可以n消耗两次,m消耗一次。紧接着n消耗1次,m消耗两次 那么可以n消耗两次,m消耗一次。紧接着n消耗1次,m消耗两次
也 就 是 答 案 再 加 上 n / 3 ∗ 2 也就是答案再加上n/3*2 也就是答案再加上n/3∗2
这 个 时 候 n 和 m 余 数 可 能 是 0 , 1 , 2 , 如 果 余 数 是 2 说 明 答 案 还 可 以 加 1 这个时候n和m余数可能是0,1,2,如果余数是2说明答案还可以加1 这个时候n和m余数可能是0,1,2,如果余数是2说明答案还可以加1
方 法 二 : 结 论 \color{Red}方法二:结论 方法二:结论
可 以 这 么 说 , 这 种 情 况 下 答 案 一 定 是 ( n + m ) / 3 可以这么说,这种情况下答案一定是(n+m)/3 可以这么说,这种情况下答案一定是(n+m)/3
因 为 经 过 上 面 的 分 析 知 道 最 后 n 和 m 一 定 可 以 用 到 都 小 于 3 因为经过上面的分析知道最后n和m一定可以用到都小于3 因为经过上面的分析知道最后n和m一定可以用到都小于3
所 以 只 要 存 在 n + m 还 大 于 等 于 3 , 不 管 n 多 还 是 m 多 所以只要存在n+m还大于等于3,不管n多还是m多 所以只要存在n+m还大于等于3,不管n多还是m多
都 可 以 消 耗 多 的 2 次 少 的 1 次 把 n 和 m 都 变 成 小 于 3 的 情 况 , 对 答 案 都 有 贡 献 都可以消耗多的2次少的1次把n和m都变成小于3的情况,对答案都有贡献 都可以消耗多的2次少的1次把n和m都变成小于3的情况,对答案都有贡献
#include
using namespace std;
int t,n,m;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
if(n>m) swap(n,m);
if(n*2<=m) cout<