2020浙江工业大学程序设计迎新赛——决赛(重现赛)H-AUG大师

题目

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 cd×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 1T10
1 ≤ n ≤ 1 0 5 1\le n \le 10^5 1n105
0 ≤ m ≤ 1 0 8 0\le m \le 10^8 0m108
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 0a,di,c1,k1,c2,k2104
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 CKd,问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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值