D. For Gamers. By Gamers.(前缀和)
D. For Gamers. By Gamers.
Tag
前缀和
rating2000
题目来源
Educational Codeforces Round 125 (Rated for Div. 2)
题目大意
-
给你n种勇士,你每次战斗只能派一种类型的勇士上场,每个勇士有如下的属性:
- 代表勇士的价格
- 代表勇士的攻击力
- 代表勇士的生命值
-
你可以买多个这样的勇士,但是最后的价钱不能超过C
-
现在你要面对m个恶魔,每个恶魔都会有如下属性
- 代表恶魔的攻击力
- 代表恶魔的生命值
-
对于每一次的战斗,勇士的攻击力和恶魔的攻击力都是连续性的,获胜的方法为,在恶魔击杀任何一名勇士之前击杀恶魔
-
求问面对每个恶魔,你是否能够有一种办法击败他们,如果有,最小的花费应该是多少
解题思路
- 首先我们假设拥有某种类型的勇士个,那么击败恶魔的方程便是
移项,得到
由此可见,我们只需要关注每个勇士或者恶魔的攻击力和生命值的乘积即可
- 接下来我们设表示花费为不超过c的情况下,能够造成的最大乘积,考虑到可以买多个勇士的影响,我们对于每个花费低的勇士都尝试买多个勇士看看能不能优于买较少的花费高的勇士,这样的复杂度为
对于没有访问到的数据,我们可以用前缀和求出
- 最终我们用二分法可以得到每个恶魔花费的最小成本了
AC代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define maxn (int)(1e6 + 10)
#define IOS ios::sync_with_stdio(0);
#define FFF freopen("out", "w", stdout);
int n , C ;
int m ;
LL bst[maxn];
LL ans[maxn];
int main ()
{
IOS;
cin >> n >> C ;
for ( int i = 1 ; i <= n ; i++ )
{
LL c , d , h;
cin >> c >> d >> h;
bst[c] = max(bst[c], d*h);
}
for ( int c = 1 ; c <= C ; c++ )
for ( int xc = c ; xc <= C ; xc += c )
bst[xc] = max(bst[xc], bst[c] * (xc/c));
for ( int i = 1 ; i <= C ; i++ )
bst[i] = max(bst[i], bst[i-1]);
cin >> m ;
for ( int i = 1 ; i <= m ; i++ )
{
LL D , H;
cin >> D >> H;
int pos = upper_bound(bst+1, bst+1+C, D*H) - bst;
if ( pos == C+1 )
ans[i] = -1;
else ans[i] = pos;
}
for ( int i = 1 ; i <= m ; i++ )
cout << ans[i] << " ";
cout << endl;
}
分类:
Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人