Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords(贪心/数学)
2024-09-04 08:10:55
题目链接: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();
}
最新文章
- JavaScript 作用域知识点梳理
- 如何写出优雅的CSS代码 ?(转)
- [Azure附录]1.在Windows Server 2012中安装Active Directory域服务
- jquery对于table的操作
- angularjs源码分析之:angularjs执行流程
- 【转】浅析linux内存模型
- 【C++基础】关键字static 局部变量
- Windows Azure功能更新:SQL Server AlwaysOn和Notification Hub 正式商用
- Day3 set集合、函数和装饰器
- 理解MVC路由配置(转)
- git配置别名
- (十八)TableView实践(多组汽车品牌展示)
- localhost 和 127.0.0.1 认识
- Spring Session event事件分析
- Scout YYF I POJ - 3744(概率dp)
- python之线程同步
- unity3d平铺图片
- python 常用模块之random,os,sys 模块
- HTTP Methods 和 RESTful Service API 设计
- C# 获取汉字拼音首字母/全拼