尽梨了(贪心+dp)

尽梨了

  • problem
  • solution
  • code

problem

丰之崎学园附近共有 nnn 个商店,在时刻 000 时,英梨梨从学园出发开始购物。

从学园走到任意一个商店,或从一个商店走到另一个商店需要 111 单位时间。

如果英梨梨在时刻 ttt 到达了商店 iii ,她需要先花费 ai×t+bia_i × t + b_iai×t+bi 的时间排队,
然后才能购买这家商店的物品。

英梨梨想知道,在时刻 T+0.5T + 0.5T+0.5 之前她最多能在多少个不同商店买到物品呢?

这里假定只会在走路和排队上消耗时间,购买物品不消耗时间。

n≤2e5,T≤1e9n\le 2e5,T\le 1e9n2e5,T1e9

solution

假设在 ttt 时刻选择 iii 商店购买,然后立即到 jjj 商店购买,则 jjj 商店会多付出 (ai⋅t+bi+1)⋅aj(a_i·t+b_i+1)·a_j(ait+bi+1)aj 的时间。

假设在 ttt 时刻选择 jjj 商店购买,然后立即到 iii 商店购买,则 iii 商店会多付出 (aj⋅t+bj+1)⋅ai(a_j·t+b_j+1)·a_i(ajt+bj+1)ai 的时间。

若选择先 iiijjj 的顺序,则需满足 (ai⋅t+bi+1)⋅aj<(aj⋅t+bj+1)⋅ai⇒(bi+1)⋅aj<(bj+1)⋅ai(a_i·t+b_i+1)·a_j<(a_j·t+b_j+1)·a_i\Rightarrow (b_i+1)·a_j<(b_j+1)·a_i(ait+bi+1)aj<(ajt+bj+1)ai(bi+1)aj<(bj+1)ai

发现商店的先后顺序与时间 ttt 无关。

所以可以按照这个关系进行商店排序。

最后实际去的商店顺序按照时间排序肯定是按这个关系排序后形成的新序列的一个子序列。

暴力地设 dpi,j:dp_{i,j}:dpi,j: 在遍历到 iii 商店(已经排序过),在 jjj 个商店买到物品的最少花费时间,转移考虑是否进入 iii 商店即可,时间复杂度 O(n2)O(n^2)O(n2)

考虑特殊数据点 ∀iai>0\forall_i\ a_i>0i ai>0

通过时间转移公式可以发现,如果 ai≠0a_i\neq 0ai=0,那么进入商店后的时间是指数级增长的。

这就意味着转移的第二位只需要开到 log⁡T\log TlogT 级别就可以了。

实际上,这已经几乎是正解了。

将所有 ai=0a_i=0ai=0 的商店排到最后,只考虑 ai≠0a_i\neq 0ai=0 的商店,按照上面优化后的 dpdpdp 做即可。

最后考虑剩余的时间 T−dpk,iT-dp_{k,i}Tdpk,i 后面能接多少个 ai=0a_i=0ai=0 的商店,贪心的将这些特殊商店按照 bbb 升序排序。

时间复杂度:O(nlog⁡n+nlog⁡T)O(n\log n+n\log T)O(nlogn+nlogT)

code

#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 200005
struct node { int a, b; }it[maxn];
int n, m, T, k;
int dp[maxn][35];void read( int &x ) {x = 0; char s = getchar();while( s < '0' or s > '9' ) s = getchar();while( '0' <= s and s <= '9' ) x = ( x << 1 ) + ( x << 3 ) + ( s ^ 48 ), s = getchar();
}signed main() {freopen( "eriri.in", "r", stdin );freopen( "eriri.out", "w", stdout );read( n ), read( T );m = log( T ) / log( 2 );for( int i = 1;i <= n;i ++ ) read( it[i].a ), read( it[i].b );sort( it + 1, it + n + 1, []( node x, node y ) { return ( x.b + 1 ) * y.a < ( y.b + 1 ) * x.a; } );while( it[k + 1].a ) k ++;for( int i = 0;i <= n;i ++ )for( int j = 1;j <= m;j ++ ) dp[i][j] = T + 1;for( int i = 1;i <= k;i ++ )for( int j = 1;j <= m;j ++ )dp[i][j] = min( min( T + 1, dp[i - 1][j] ), dp[i - 1][j - 1] + 1 + ( dp[i - 1][j - 1] + 1 ) * it[i].a + it[i].b );sort( it + k + 1, it + n + 1, []( node x, node y ) { return x.b < y.b; } );int ans = 0;for( int i = 0;i <= m and dp[k][i] <= T;i ++ ) {int sum = T - dp[k][i], cnt = 0;for( int j = k + 1;j <= n and sum > it[j].b;j ++ )cnt ++, sum -= it[j].b + 1;ans = max( ans, i + cnt );}printf( "%lld\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1612G Max Sum Array

解析 被蓝题虐了。&#xff08;悲 确实不太难&#xff0c;就是没往那边想。 考虑如果某个值的下标分别位 i1,i2,...,ini_1,i_2,...,i_ni1​,i2​,...,in​ 那么如何计算贡献。 每一个下标和前面统计时作为被减数&#xff0c;和后面统计时作为减数&#xff0c;所以 iki_kik​ …

【Acwing 219. 剪纸游戏】

【Acwing 219. 剪纸游戏】 题意&#xff1a; 给定一张 NM 的矩形网格纸&#xff0c;两名玩家轮流行动。 在每一次行动中&#xff0c;可以任选一张矩形网格纸&#xff0c;沿着某一行或某一列的格线&#xff0c;把它剪成两部分。 首先剪出 11 的格纸的玩家获胜。 两名玩家都采取…

中国.NET:东莞+长沙.NET俱乐部现场花絮及合肥、苏州、上海等地活动预

《传承有序》与微软技术的发展历程相似&#xff0c;微软俱乐部的发展经历着沉沉浮浮&#xff0c;曾经随着微软走向封闭与固执&#xff0c;.NET社区年轻一代的声音被忽略&#xff0c;.NET社区后继无人。社区的沉默是可怕的&#xff0c;很多社区沉寂消亡。但是在2018年&#xff0…

团不过(dp)

团不过problemsolutioncodeproblem 由比滨结衣和雪之下雪乃在玩 NimNimNim 游戏。 共有 nnn 堆石子&#xff0c;双方轮流操作&#xff0c;每次可以从一堆非空石子堆中取走任意个石 子&#xff0c;取走最后一个石子的人胜利。 她们决定让由比滨结衣先手&#xff0c;但忘记了每…

【AcWing 235. 魔法珠

【AcWing 235. 魔法珠 题意&#xff1a; 有n堆魔法珠&#xff0c;第i堆有ai个&#xff0c;两个人轮流进行以下操作&#xff1a; 当轮到某人操作时&#xff0c;如果每堆中魔法珠的数量均为 1&#xff0c;那么他就输了。 问谁赢谁输 题解&#xff1a; 经典博弈论问题 注意本…

P5039 [SHOI2010]最小生成树(网络流)

解析 我大受震撼。 真的没想到是网络流。&#xff08;事后诸葛&#xff1a;看几百的数据范围应该试试枚举算法&#xff09; 一道比较开眼界的题吧。 然而用一个十分钟写完的假做法可以骗90分&#xff0c;还是挺香的 首先是一个没什么意思的转化&#xff1a;操作等价于给一条边…

Abp vNext 切换MySql数据库

Abp vNext是Abp的下一代版本&#xff0c;目前还在经一步完善&#xff0c;代码已经全部重写了&#xff0c;好的东西保留了下来&#xff0c;去除了很多笨重的东西&#xff0c;从官宣来看&#xff0c;Abp vNext主要是为了以后微服务架构而诞生的。从源码来看&#xff0c;Abp vNext…

P1199 [NOIP2010 普及组] 三国游戏

P1199 [NOIP2010 普及组] 三国游戏 题意&#xff1a; 有n个武将&#xff0c;每两个武将之间都有默契值&#xff0c;你和电脑玩游戏&#xff0c;轮流选一个。轮到计算机挑选时&#xff0c;它会尝试将对手军队中的每个武将与当前每个自由武将进行一一配对&#xff0c;找出所有配…

P1791 [国家集训队]人员雇佣(网络流)

解析 熟练和固化在有些时候是等价的。 一个看起来喜闻乐见的模型。 n2n^2n2 信息量你在逗我… 结果是&#xff1a;点数 n2n^2n2 TLE&#xff0c;边数 n2n^2n2 AC。 一种之前所没有见过的打开方式。 还是考虑最小割模型&#xff0c;点 iii 向原点连一条 AiA_iAi​ 的边&#xf…

【网络流专练一】UVA五题(UVA12125,UVA11082,UVA10983,UVA1306,UVA10735)

网络流专练March of the Penguins矩阵解压 Matrix DecompressingBuy one, get the rest freeThe K-League混合图的欧拉回路 Euler Circuit什么破网站&#xff0c;多余空格换行都不能有&#xff0c;还nm不报PE/RE只报WA。 少一行换行也不行&#xff0c;这是什么垃圾文本比较。 …

采用.NET CORE的全异步模式打造一款免费的内网穿透工具--NSmartProxy

什么是NSmartProxy&#xff1f;NSmartProxy是一款免费的内网穿透工具。特点跨平台&#xff0c;客户端和服务端均可运行在MacOS&#xff0c;Linux&#xff0c;Windows系统上&#xff1b;使用方便&#xff0c;配置简单&#xff1b;多端映射&#xff0c;一个NSmart Proxy客户端可以…

Acwing 236. 格鲁吉亚和鲍勃(博弈论妙题)

Acwing 236. 格鲁吉亚和鲍勃 题意&#xff1a; 一排网格&#xff0c;将网格从左到右依次编号 1,2,3&#xff0c;…&#xff0c;并将 N 个西洋棋棋子放在不同的网格上&#xff0c;如下图所示&#xff1a; 两个人轮流移动棋子 每次玩家选择一个棋子&#xff0c;并将其向左移动…

.NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯

1&#xff0c;前言开发环境&#xff1a;在 Visual Studio 2017&#xff0c;.NET Core 2.x串口通讯用于设备之间&#xff0c;传递数据&#xff0c;物联网设备中广泛使用串口方式连接通讯&#xff0c;物联网通讯协议 &#xff1a;Modbus 协议 ASCII、RTU、TCP模式是应用层的协议&…

洛谷P1173:[NOI2016] 网格(tarjan、离散化)

解析 看起来很不码农但写起来其实还行的一道题。 主要也是因为我贺题解把所有的雷都避过去了 首先一个比较显然的结论是&#xff1a;通过堵角上的&#xff0c;答案不超过2。 所以本题只要把答案是-1&#xff0c;0&#xff0c;1&#xff0c;2的情况判出来即可。 -1是只有一个…

【无码专区5】01串(大讨论+构造)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

Game of Cards Gym - 102822G

Game of Cards Gym - 102822G 题意&#xff1a; 小兔子和小马喜欢玩奇怪的纸牌游戏。现在&#xff0c;他们正在玩一种叫做0123游戏的纸牌游戏。桌子上有几张牌。其中c0标记为0&#xff0c;c1标记为1&#xff0c;c2标记为2&#xff0c;c3标记为3。小兔子和小马轮流玩游戏&…

开源组件ExcelReport 3.x.x 使用手册(为.netcore而来

ExcelReport转眼已经开源4年了&#xff0c;期间有很长时间也停止了对它的维护。18年年末有人联系到我&#xff0c;说“兄弟&#xff0c;ExcelReport不错&#xff0c;但什么时候支持.netcore呢&#xff1f;”。我寥寥的回了几句搪塞的话&#xff0c;也没当回事。后来这兄弟又来问…

洛谷P4007:小 Y 和恐怖的奴隶主(期望、矩阵快速幂)

解析 不难发现有效的状态只有 SC113165SC_{11}^3165SC113​165 种。 同时&#xff0c;能支持 n1018n10^{18}n1018 的算法也不剩啥了&#xff0c;要么拉插&#xff0c;要么矩乘。 本题当然就是矩乘了&#xff0c;转移矩阵也较为显然。 然而&#xff0c;直接做的话复杂度是 O(T…

集合均值(逆元+数学)

problem 题目描述 有两个可重集合 nnn&#xff0c;初始时 mmm 只包含一个 000&#xff0c;是给定的。 执行以下操作&#xff1a; 在 BBB 中随机选一个数 yyy&#xff0c;把 yyy 从 BBB 移动到 AAA。给答案加上 AAA 的平均值。若 BBB 非空&#xff0c;回到步骤 111。 求最后答…

《.NET Core 和前后端那些事儿》技术交流活动纪实

长沙.NET技术社区.NET Core和前后端那些事儿技术交流纪实2019年3月10日&#xff0c;下午&#xff0c;在位于沁园春御院的长沙市互联网活动基地&#xff0c;在长沙市.NET技术社区的组织下&#xff0c;长沙市.NET技术圈第一次纯粹的技术沙龙在这里召开。这次活动总共参加人数超过…