题目链接:https://codeforces.com/contest/1366/problem/A

题意

有两个数 $a$ 和 $b$,每次可以选择从一个数中取 $2$,另一个数中取 $1$,问最多可以进行多少次这样的操作。

题解一

比较好想的一种模拟的做法:

  • 较多者每次取两个至二者相等
  • 二者每次同时取三个
  • 如果较多者和较少者有余再加一

代码

#include <bits/stdc++.h>
using namespace std; void solve() {
int a, b; cin >> a >> b;
if (a < b) swap(a, b);
int sub = min(a - b, b);
a -= 2 * sub, b -= sub;
int mi = min(a, b) / 3;
a -= 3 * mi, b -= 3 * mi;
cout << sub + 2 * mi + (a >= 2 and b >= 1) << "\n";
} int main() {
int t; cin >> t;
while (t--) solve();
}

题解二

假设 $a ≥ b$,如果 $a ≥ 2b$,此时可以一直两两地取 $a$,答案即 $b$ 。

否则,$a$ 和 $b$ 会轮流取至和小于 $3$,答案即 $\lfloor \frac{a + b}{3} \rfloor$ 。

代码

#include <bits/stdc++.h>
using namespace std; void solve() {
int a, b; cin >> a >> b;
if (a < b) swap(a, b);
if (a >= 2 * b)
cout << b << "\n";
else
cout << (a + b) / 3 << "\n";
} int main() {
int t; cin >> t;
while (t--) solve();
}

题解三

可以理解为题解二的简化版吧...

代码

#include <bits/stdc++.h>
using namespace std; void solve() {
int a, b; cin >> a >> b;
cout << min({a, b, (a + b) / 3}) << "\n";
} int main() {
int t; cin >> t;
while (t--) solve();
}

最新文章

  1. JavaScript 作用域知识点梳理
  2. 如何写出优雅的CSS代码 ?(转)
  3. [Azure附录]1.在Windows Server 2012中安装Active Directory域服务
  4. jquery对于table的操作
  5. angularjs源码分析之:angularjs执行流程
  6. 【转】浅析linux内存模型
  7. 【C++基础】关键字static 局部变量
  8. Windows Azure功能更新:SQL Server AlwaysOn和Notification Hub 正式商用
  9. Day3 set集合、函数和装饰器
  10. 理解MVC路由配置(转)
  11. git配置别名
  12. (十八)TableView实践(多组汽车品牌展示)
  13. localhost 和 127.0.0.1 认识
  14. Spring Session event事件分析
  15. Scout YYF I POJ - 3744(概率dp)
  16. python之线程同步
  17. unity3d平铺图片
  18. python 常用模块之random,os,sys 模块
  19. HTTP Methods 和 RESTful Service API 设计
  20. C# 获取汉字拼音首字母/全拼

热门文章

  1. 请求接口获取的json 字符串 前后不能有 双引号
  2. 【Java基础】面向对象下
  3. LeetCode841 钥匙和房间
  4. (二)React Ant Design Pro + .Net5 WebApi:前端环境搭建
  5. Java程序入门
  6. pandas高级操作
  7. 前端工程构建之谈:gulp3要不要升级到Gulp4
  8. C#高级编程第11版 - 第七章 索引
  9. c#使用谷歌身份验证GoogleAuthenticator
  10. MySQL的双主配置