题目
Description
王辉是一名出色的CS:GO(一个射击游戏)选手,他擅长使用武器AUG,由于他对AUG的掌握程度十分之高,因此常常自称为AUG大师。有一天AUG大师遇上了另一个CS:GO选手 w x s wxs wxs ,和王辉不同, w x s wxs wxs 擅长使用的,是所有的武器,毫无疑问王辉输给了 w x s wxs wxs 。于是王辉决心向 w x s wxs wxs 学习其他武器的用法。
第一天,王辉新学习的武器是P90,为了降低他的学习难度, w x s wxs wxs也允许王辉使用他最爱的AUG。每种武器有两个属性,基础伤害 c 和伤害衰减速率 k k k ,对于一个距离为 d 的敌人,使用 1 次该武器可以对其造成至多 c − d × k c-d\times k c−d×k 点伤害。每个敌人有两个属性:血量 a 和它到王辉的距离 d ,王辉要击败这个敌人需要至少对它造成 a 点伤害。
王辉现在面临着 nn 个敌人,第 ii 个敌人血量为 a i a_i ai,到王辉的距离为 d i d_i di。王辉能使用两种武器AUG和P90,其中AUG的基础伤害和伤害衰减速率为 c 1 c_1 c1 k 1 k_1 k1,P90的基础伤害和伤害衰减速率为 c 2 c_2 c2 k 2 k_2 k2, w x s wxs wxs 要求王辉只能最多使用 m m m 次武器。王辉当然想击败尽可能多的敌人,于是他向你寻求帮助,他需要知道自己能击败的最大敌人数。
Input
输入一个整数 T ,表示有 T 组测试数据。
每组测试数据输入 4 行
第一行输入 2 个整数
n
,
m
n,m
n,m
第二行输入 4 个整数
c
1
,
k
1
,
c
2
,
k
2
c_1,k_1,c_2,k_2
c1,k1,c2,k2c ,第三行输入 nn 个整数
a
1
,
a
2
,
⋯
,
a
n
a_1,a_2,\cdots,a_n
a1,a2,⋯,an
第四行输入 n 个整数
d
1
,
d
2
,
⋯
,
d
n
d_1,d_2,\cdots,d_n
d1,d2,⋯,dn
1
≤
T
≤
10
1\le T \le 10
1≤T≤10
1
≤
n
≤
1
0
5
1\le n \le 10^5
1≤n≤105
0
≤
m
≤
1
0
8
0\le m \le 10^8
0≤m≤108
0
≤
a
,
d
i
,
c
1
,
k
1
,
c
2
,
k
2
≤
1
0
4
0\le a,d_i,c_1,k_1,c_2,k_2 \le 10^4
0≤a,di,c1,k1,c2,k2≤104
Output
每组数据输出输出一行,包含一个整数,表示王辉能击败的最大敌人数。
Sample Input 1
1
5
7
10 1 22 3
10 10 10 10 10
4 5 7 10 15
题意
选择两把武器,每一把武器有初始伤害C和衰减伤害K,有n名敌人,每名敌人有一个血量a和距离d,每次射击伤害为 C − K ∗ d C-K*d C−K∗d,问m次射击最多消灭多少个敌人。
思路
每把枪对同一个敌人的伤害是一定的,对于根据计算选出最合适的武器,算出每个敌人需要最少几下可以击败,贪心按照击败需要的次数从小到大排序,依次选到大于当前剩余开枪次数即可。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define moxiaobai false
#define plog if(moxiaobai) cout
const int maxn = 1000000+100;
class node {
public:
ll a,d,cho,tick,dam;
}t[maxn];
bool cmp(node a,node b)
{
return a.tick<b.tick;
}
int main()
{
int T;
cin>>T;
while(T--)
{
ll n,m;
cin>>n>>m;
ll c1,k1,c2,k2;
cin>>c1>>k1>>c2>>k2;
for(int i=1;i<=n;i++) cin>>t[i].a;
for(int i=1;i<=n;i++) cin>>t[i].d;
ll ans = 0;
for(int i=1;i<=n;i++)
{
t[i].dam = max(0LL,max(c1 - k1 * t[i].d , c2 - k2*t[i].d));
if(t[i].dam <= 0)
{
t[i].tick = INT_MAX;
continue;
}
t[i].tick = t[i].a/t[i].dam + (t[i].a%t[i].dam==0?0:1);
}
sort(t+1,t+1+n,cmp);
//for(int i=1;i<=n;i++)cout<<t[i].tick<<" ";
for(int i=1;i<=n;i++)
if(m >= t[i].tick) m -= t[i].tick , ans++;
cout<<ans<<"\n";
}
}
/*
1
5 7
10 1 22 3
10 10 10 10 10
4 5 7 10 15
*/