题目

  点这里看题目。

分析

  首先不难发现答案具有单调性,因此可以二分答案。答案上限为\(V=2m\times \max\{a_i, b_i\}\)。

  考虑如何去判断当前的答案。设这个答案为\(mid\)。

  我们可以将一块三角形拼图看做一个向量,表示在这个拼图内走过的位移。因此我们的叠放的拼图可以看做一组连续的向量。

  因此可以发现拼图摆放顺序不影响结果。

  故可以考虑一个 DP :

  \(f(i,j,k)\):前\(i\)块拼图可不可以走到\((j,k)\)这个位置。

  转移略。这个做法有着\(O(nm^4)\)的优秀复杂度......

  不过判断性的 DP 实际上是非常不划算的。我们考虑把它转成一个最优性的 DP 。

  可以发现一个单调性:如果可以用一些拼图走到\((i,j)\),那么对于\(k\le j\),我们也一定可以走到\((i,k)\)。

  证明不会略,感性理解一下就好(其实不难理解)。

  然后就可以想到一个 DP :

  \(f(i,j)\):\(\max\{k|\text{用前}i\text{块拼图可以走到}(k,j)\}\)。

  转移就只需要考虑新的一块拼图放在前\(i-1\)块凑出的边界上的情况:

\[f(i,j)=\max_{\max\{0, j-\lfloor\frac {mid}{a_i}\rfloor\}\le k\le j}\{f(i-1,k)+\lfloor\frac{mid-a_i(j-k)}{b_i}\rfloor\}
\]

  转移\(O(nm^2)\)。总时间为\(O(nm^2\log_2 V)\)。

代码

#include <cstdio>
#include <cstring> const int INF = 0x3f3f3f3f;
const int MAXN = 105, MAXM = 105; template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
} template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
} template<typename _T>
_T MAX( const _T a, const _T b )
{
return a > b ? a : b;
} int f[MAXN][MAXM];
int a[MAXN], b[MAXN];
int N, M; bool chk( int K )
{
int lA;
memset( f, 0xc0, sizeof f );
f[0][0] = 0;
for( int i = 1 ; i <= N ; i ++ )
for( int j = 0 ; j <= M ; j ++ )
{
lA = 1.0 * K / a[i];
for( int k = j ; ~ k && j - k <= lA ; k -- )
f[i][j] = MAX( f[i][j], f[i - 1][k] + int( 1.0 * K / b[i] + 1.0 * a[i] / b[i] * ( k - j ) ) );
}
return f[N][M] >= M;
} int main()
{
int l = 1, r = 0, mid;
read( N ), read( M );
for( int i = 1 ; i <= N ; i ++ ) read( a[i] ), read( b[i] ), r = MAX( r, MAX( a[i], b[i] ) );
r *= M << 1;
while( r - l > 1 )
{
mid = l + r >> 1;
if( chk( mid ) ) r = mid;
else l = mid + 1;
}
if( chk( l ) ) write( l );
else write( r );
puts( "" );
return 0;
}

[LOJ#500]「LibreOJ β Round」ZQC的拼图的更多相关文章

  1. loj#500 「LibreOJ β Round」ZQC 的拼图

    分析 二分倍数 然后考虑dp[i][j]表示选到第i个x轴覆盖到j的情况y轴最多覆盖多少 贡献柿子可以画图然后相似三角形得到 代码 #include<bits/stdc++.h> usin ...

  2. LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)

    题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...

  3. LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)

    题面 传送门 题解 首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例 我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\ ...

  4. loj#501 「LibreOJ β Round」ZQC 的树列

    分析 代码(我的代码是瞎jb水过去的) #include<bits/stdc++.h> using namespace std; #define li long long li a[]; ...

  5. #505. 「LibreOJ β Round」ZQC 的游戏

    题目描述 首先一定是让ZQC吃掉他能吃到的所有的球,这样才能尽可能的满足ZQC的质量是所有玩家中最大的. 在满足某一个玩家的质量不会超过ZQC的情况下,让这个玩家吃掉尽可能多的球,让其他玩家吃掉的尽可 ...

  6. LOJ504「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 题解 对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了. 如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中 ...

  7. 「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 一类套路题. 首先这个玩意可以两个logn树套树做.... naive地,把区间内的所有数拿出来放进堆里.不断取出. 太多了. 所以开始只保留那初 ...

  8. #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

    题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...

  9. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

随机推荐

  1. Hyperledger Fabric开发(二):创建网络

    运行fabric-samples项目中的一个例子:first-network,创建第一个网络(Building Your First Network). 该网络共有4个peer节点,划分为2个组织(o ...

  2. 技术大佬:我去,你竟然还不会用 this 关键字

    上一篇文章写的是 Spring Boot 的入门,结果有读者留言说,Java 都还没搞完,搞什么 Spring Boot,唬得我一愣一愣的.那这篇就继续来搞 Java,推出广受好评的我去系列第四集:你 ...

  3. 程序员使用IDEA这些插件后,办公效率提升100%(持续更新中)

    IDEA一些不错的插件分享 目录 IDEA一些不错的插件分享 插件集合 CamelCase Translation LiveEdit MarkDown Navigator Jrebel CheckSt ...

  4. 不懂代码?没关系,照样可以做SaaS软件开发

    众所周知,一家标准化的企业的日常运营管理都需要一个强大的中枢或中台管理系统来统筹整个企业或是整个集团的运作,这个强大的中台管理系统就相当于是企业的引擎.在引擎的带动下,汽车可以快速的飞驰起来,同样,在 ...

  5. 补充_001_问题_001_Vivian

    在此先向前辈们和同学们道个歉,一是没有认真地专研前辈们的精文,二是对一些读者造成了一定程度上的困扰,为此鄙人深感抱歉,现在对"问题_001_Vivian"中不严谨的地方进行修改: ...

  6. switch下返回各类的数值

    定义一个变量,在每个case下赋值,最后return public static int orderDishes(int choice) { int price = 0; switch (choice ...

  7. ES[7.6.x]学习笔记(十一)与SpringBoot结合

    在前面的章节中,我们把ES的基本功能都给大家介绍完了,从ES的搭建.创建索引.分词器.到数据的查询,大家发现,我们都是通过ES的API去进行调用,那么,我们在项目当中怎么去使用ES呢?这一节,我们就看 ...

  8. 需求:一个页面中需要用到多个字典数据。用于下拉选项,同时,需要将其保存为json格式。以便于key,value的相互转换。记录在实现过程中踩的坑

    本文涉及到的知识: Promise,all()的使用 js处理机制 reduce的用法 map的用法 同步异步 需求: 一个页面中需要用到多个字典数据.用于下拉选项,同时,需要将其保存为json格式. ...

  9. Android 中加载本地Html 跨域问题,http协议允许加载

    一.需求: 后台加载HTML的包时间太长,太卡,让把所有的HTML包放到前台:使用的是file://协议,有些内容和样式加载不出来,H5那边说需要用http://协议来加载: 二.处理过程: 安卓最简 ...

  10. Rocket - util - Counters

    https://mp.weixin.qq.com/s/q7R2Dn9p9cch_ABN4raReQ   介绍几种计数器的实现,以及其中的一点小细节.   ​​   1. ZCounter   ​​   ...