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\) 件装备,有如下不等式

\[\begin{equation}
\left\{
\begin{array}{lr}
2m+4n &\leq x\\
3m+n &\leq y\\
m,n & \geq 0
\end{array}
\right.
\end{equation}
\]

使用线性规划方法,会得到三种可能图像:

  1. 两直线交点横坐标小于 \(0\) ,即 \(-x+4y < 0\) ,此时答案就是 \(y\) 。
  2. 两直线交点纵坐标小于 \(0\) ,即 \(3x-2y < 0\) ,此时答案就是 \(\lfloor \frac{x}{2} \rfloor\) 。
  3. 两直线交点在第一象限,则确定交点横坐标,分别取上下整对应函数计算纵坐标,取横纵坐标之和最大值。

时间复杂度 \(O(1)\)

空间复杂度 \(O(1)\)

方法二

知识点:三分。

设第一种方案做了 \(m\) 件装备,则根据不等式:

\[\begin{equation}
\left\{
\begin{array}{lr}
2m+4n &\leq x\\
3m+n &\leq y\\
m,n & \geq 0
\end{array}
\right.
\end{equation}
\]

有如下等式:

\[ans = m + min(\lfloor \frac{x - 2m}{4} \rfloor, y - 3m)
\]

显然是单调函数,有单峰,考虑三分。根据不等式得到 \(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 装备合成的更多相关文章

  1. 【BZOJ 3443】 3443: 装备合成 (离线+线段树)

    3443: 装备合成 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 63  Solved: 31 Description [背景]     lll69 ...

  2. [置顶] 九度笔记之 1494:Dota

    题目1494:Dota 1 秒 内存限制:128 兆 特殊判题:否 提交:559 解决:122 题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备 ...

  3. 九度 1494:Dota(完全背包)

    题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素.英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备.为了简化问题,我们将每个装备对于英雄的功能抽象为一个整 ...

  4. bzoj1000~1025

    以后还是这样 25道题一起发 看着爽 noip失利之后发粪涂墙 刷了一波bzoj 题解: bzoj1000 A+B问题 这题不同的人有不同的写法,我写了个线段树套Treap,应该还是挺简单的 但是看别 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. 九度oj 题目1494:Dota

    题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备. 为了简化问题,我们将每个装备对于英雄的功能抽象为一 ...

  7. 我叫mt3.2更新公告

    1.增加装备合成功能 可以用材料将现有的75级紫装升级为80级紫装. 2.增加全新公会副本 增加新的公会副本:神庙外围.掉落可以进阶装备的材料. 3.增加全新个人副本 增加新的个人副本:奴隶市场. 4 ...

  8. [luogu4037 JSOI2008] 魔兽地图 (树形dp)

    传送门 Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the ...

  9. 合金装备V 幻痛 制作技术特辑

    合金装备V:幻痛 制作特辑 资料原文出自日版CGWORLD2015年10月号   在[合金装备4(Metal Gear Solid IV)]7年后,序章作品[合金装备5 :原爆点 (Metal Gea ...

随机推荐

  1. CesiumJS 2022^ 原理[3] 渲染原理之从 Entity 看 DataSource 架构 - 生成 Primitive 的过程

    目录 API 用法回顾 1. 为什么要从 Viewer 访问 Entity API 1.1. 高层数据模型的封装 - DataSource API 1.2. 显示管理器 DataSourceDispl ...

  2. Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 论文解读(VLDB 2021)

    Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 论文解读(VLDB 2021) 本 ...

  3. 前台主页搭建、后台主页轮播图接口设计、跨域问题详解、前后端互通、后端自定义配置、git软件的初步介绍

    今日内容概要 前台主页 后台主页轮播图接口 跨域问题详解 前后端打通 后端自定义配置 git介绍和安装 内容详细 1.前台主页 Homeviwe.vue <template> <di ...

  4. 攻防世界-MISC:SimpleRAR

    这是攻防世界新手练习区的第十题,题目如下: 点击下载附件1,是一个RAR文件,解压一下,得到flag.txt文件,激动的点进去看一下 好吧,就知道没有这么简单,用010editor打开这个RAR文件, ...

  5. 一个比 Nginx 功能更强大的 Web 服务器

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ Caddy 简介 Caddy 是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能,随 ...

  6. 【DIY】【CSAPP-LAB】深入理解计算机系统--datalab笔记

    title: 前言 <深入理解计算机系统>一书是入门计算机系统的极好选择,从其第三版的豆瓣评分9.8分可见一斑.该书的起源是卡耐基梅龙大学 计算机系统入门课(Introduction to ...

  7. 渗透:wesside-ng

    WEP自动破解工具wesside-ng wesside-ng是aircrack-ng套件提供的一个概念验证工具.该工具可以自动扫描无线网络,发现WEP加密的AP.然后,尝试关联该AP.关联成功后,它会 ...

  8. 关于一些lrzsz的知识

    问题:如何从windows轻松上传文件到Linux? 方法:容器里面:apt-get update && apt-get install lrzsz 有yum的情况:yum -y in ...

  9. 一个 curl 配置引发的惨案

    问题 这两天想装新版本的 node,发现 nvm 一直报下面这个错误.我反复 Google 了,但是并没有找到一条我能用的. 痛苦 我起初一直怀疑是我用的 zsh-nvm 抽疯,所以今天有空就把它还有 ...

  10. 腾讯云Redis全面升级,性能提升400%,可用性高达5个9

    2022年6月,腾讯云Redis全新升级,发布高性能版本,单节点可提供50W+吞吐,性能是原生Redis的4倍.同时,腾讯云Redis推出全球复制功能,解决原生Redis诸多痛点问题,可用性升级高达9 ...