NC200211 装备合成
NC200211 装备合成
题目
题目描述
牛牛有 \({x}\) 件材料 \({a}\) 和 \({y}\) 件材料 \({b}\) ,用 \({2}\) 件材料 \({a}\) 和 \({3}\) 件材料 \({b}\) 可以合成一件装备,用 \({4}\) 件材料 \({a}\) 和 \({1}\) 件材料 \({b}\) 也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。
输入描述
输入包含 \({t}\) 组数据
第一行一个整数 \({t}\)
接下来 \({t}\) 行每行两个整数 \({x,y}\)
输出描述
每组数据输出一行一个整数表示答案。
示例1
输入
5
4 8
7 6
8 10
100 4555
45465 24124
输出
2
2
3
50
13917
备注
\({1<=t<=10000}\)
\({1<=x,y<=1e9}\)
题解
思路
方法一
知识点:数学(线性规划)。
设第一种方案做了 \(m\) 件装备,第二种方案做了 \(n\) 件装备,有如下不等式
\left\{
\begin{array}{lr}
2m+4n &\leq x\\
3m+n &\leq y\\
m,n & \geq 0
\end{array}
\right.
\end{equation}
\]
使用线性规划方法,会得到三种可能图像:
- 两直线交点横坐标小于 \(0\) ,即 \(-x+4y < 0\) ,此时答案就是 \(y\) 。
- 两直线交点纵坐标小于 \(0\) ,即 \(3x-2y < 0\) ,此时答案就是 \(\lfloor \frac{x}{2} \rfloor\) 。
- 两直线交点在第一象限,则确定交点横坐标,分别取上下整对应函数计算纵坐标,取横纵坐标之和最大值。
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
方法二
知识点:三分。
设第一种方案做了 \(m\) 件装备,则根据不等式:
\left\{
\begin{array}{lr}
2m+4n &\leq x\\
3m+n &\leq y\\
m,n & \geq 0
\end{array}
\right.
\end{equation}
\]
有如下等式:
\]
显然是单调函数,有单峰,考虑三分。根据不等式得到 \(l = 0 , r = \min(\lfloor \frac{x}{2} \rfloor,\lfloor \frac{y}{3} \rfloor)\) 。
三分要注意写法,mid1 = l + (r-l)/3 以及 mid2 = r - (r-l)/3 ,必须是两边,以防因为当 (r - l) / 3 = 0 时,会持续移动左边界,越过峰or谷导致出错。个人喜欢下面这种写法:
int l = start,r = end;
while(l<=r){//单峰函数三分
int mid1 = l + (r-l)/3;
int mid2 = r - (r-l)/3;
if(calc(mid1)<=calc(mid2)) l = mid1 + 1;
else r = mid2 - 1;
}
//最终答案是 l-1 或者 r(不一定,要注意具体意义)
最后输出得到的点代入值。
时间复杂度 \(O(\log ( \min(\lfloor \frac{x}{2} \rfloor,\lfloor \frac{y}{3} \rfloor))\)
空间复杂度 \(O(1)\)
代码
方法一
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
ll x, y;
cin >> x >> y;
if (-x + 4 * y < 0) cout << y << '\n';
else if (3 * x - 2 * y < 0) cout << x / 2 << '\n';
else {
int m1 = (-x + 4 * y) / 10, m2 = (-x + 4 * y + 9) / 10;///不能确定去上整还是下整更优,那就都来一遍
cout << max(m1 + (x - 2 * m1) / 4, m2 + y - 3 * m2) << '\n';///记得上下正对应不同函数
//int m = (-x + 4LL * y + 5) / 10;///玄学四舍五入居然也能过
//cout << m + min((x - 2 * m) / 4, y - 3 * m) << '\n'; ///不知道用哪个函数,但n被最小的那个限制,这么写就行
}
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
方法二
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int x, y;
bool check(int mid1, int mid2) {
int ans1 = mid1 + min((x - 2 * mid1) / 4, y - 3 * mid1);
int ans2 = mid2 + min((x - 2 * mid2) / 4, y - 3 * mid2);
return ans1 <= ans2;
}
bool solve() {
cin >> x >> y;
int l = 0, r = min(x / 2, y / 3);
while (l <= r) {///三分m
int mid1 = l + (r - l) / 3;
int mid2 = r - (r - l) / 3;///不能l+2*(r-l)/3
//!这个很关键,因为当(r - l) / 3 = 0 时,会持续移动左边界,越过峰or谷
//!改成r - (r - l) / 3,在r-l<=2时会退化成r,也就是之后不足三分直接让l和r两点比较谁大,相当于枚举
if (check(mid1, mid2)) l = mid1 + 1;
else r = mid2 - 1;
}
cout << r + min((x - 2 * r) / 4, y - 3 * r) << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
NC200211 装备合成的更多相关文章
- 【BZOJ 3443】 3443: 装备合成 (离线+线段树)
3443: 装备合成 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 63 Solved: 31 Description [背景] lll69 ...
- [置顶] 九度笔记之 1494:Dota
题目1494:Dota 1 秒 内存限制:128 兆 特殊判题:否 提交:559 解决:122 题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备 ...
- 九度 1494:Dota(完全背包)
题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素.英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备.为了简化问题,我们将每个装备对于英雄的功能抽象为一个整 ...
- bzoj1000~1025
以后还是这样 25道题一起发 看着爽 noip失利之后发粪涂墙 刷了一波bzoj 题解: bzoj1000 A+B问题 这题不同的人有不同的写法,我写了个线段树套Treap,应该还是挺简单的 但是看别 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 九度oj 题目1494:Dota
题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备. 为了简化问题,我们将每个装备对于英雄的功能抽象为一 ...
- 我叫mt3.2更新公告
1.增加装备合成功能 可以用材料将现有的75级紫装升级为80级紫装. 2.增加全新公会副本 增加新的公会副本:神庙外围.掉落可以进阶装备的材料. 3.增加全新个人副本 增加新的个人副本:奴隶市场. 4 ...
- [luogu4037 JSOI2008] 魔兽地图 (树形dp)
传送门 Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the ...
- 合金装备V 幻痛 制作技术特辑
合金装备V:幻痛 制作特辑 资料原文出自日版CGWORLD2015年10月号 在[合金装备4(Metal Gear Solid IV)]7年后,序章作品[合金装备5 :原爆点 (Metal Gea ...
随机推荐
- 从.net开发做到云原生运维(八)——DevOps实践
1. DevOps的一些介绍 DevOps(Development和Operations的组合词)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的 ...
- Linux 运维请务必收藏~ Nginx 五大常见应用场景
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性,在连接高并 ...
- 【Pandas vs SQL】数据分析代码逐行比对,孰优孰劣?
在数据分析领域,pandas是python数据分析基础工具,SQL是数据库最常用分析语言.二者有相通的地方,也有很大的语法不同,做起数据分析来,谁将更胜一筹呢? 做过业务开发.跟数据库打交道比较多的小 ...
- Wireshark抓包分析TCP“三次握手,四次挥手”
1.目的 客户端与服务器之间建立TCP/IP连接,我们知道是通过三次握手,四次挥手实现的,但是很多地方对这个知识的描述仅限于理论层面,这次我们通过网络抓包的方式来看一下实际的TCP/IP传输过程. 2 ...
- wsgiref模块、web框架、django框架简介
"""web框架:将前端.数据库整合到一起的基于互联网传输的python代码 web框架也可以简单的理解为是软件开发架构里面的'服务端'""" ...
- 通过Go实现AES加密和解密工具
本文包含如下两个内容: AES加密介绍及实现原理 Go实现AES加密和解密工具 AES加密介绍及实现原理 AES( advanced encryption standard)使用相同密钥进行加密和解密 ...
- 最新管家婆财贸ERP C9 V22.0的应用网页版的财务软件1000用户补丁免狗授权注册机网络版软件下载
管家婆财贸ERPC9应用价值: 1.多组织独立核算 多种组织形态核算,出具独立的三大财务报表及业务报表,发挥经营管理的积极性,便于专业化运营. 2.兼顾统筹与分权 满足多种集团统管与分权管控模式需求, ...
- 九种常见UML图(分类+图解)
九种常见UML图 1.类图 概述 类图(Class Diagram)是面向对象系统建模中最常用和最重要的图,是定义其它图的基础. 类图主要是用来显示系统中的类.接口以及它们之间的静态结构和关系的一种静 ...
- 821. Shortest Distance to a Character - LeetCode
Question 821. Shortest Distance to a Character Solution 思路:遍历字符串S,遇到与字符C相等就分别向左/右计算其他字符与该字符的距离,如果其他字 ...
- mysqldump速查手册
一.mysqldump用法 1.1 常见选项 --all-databases, -A: 备份所有数据库 --databases, -B: 用于备份多个数据库,如果没有该选项,mysqldump把第一个 ...