不是最优解
这道题主要是处理每一个怪物要攻击几次才能击杀,又会对小红造成多少伤害,所以肯定要先击败对小红造成伤害少的怪物
只需要一个for循环,先记录小红第n次攻击能造成多少伤害,用数组a[]记录这里下标从0开始,因为第n次击杀小怪只会收到n-1次攻击,所以下标从0开始,代表为n才击杀,则小红也会被攻击n次
每隔两次普通攻击是一次强化攻击,所以a[0]=2,a[1]=3,a[2]=4,a[3]=5.....
然后判断a[i]是不是大于小怪血量,如果是记录小怪会对小红造成的伤害,b[ ]存入小怪攻击力,b[ ] * i 就是小怪会对小红造成的伤害,可以用二分也可以顺序枚举写。
然后对 b[ ] 排序,在判断小红最多能击杀多少怪物
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=110000;
ll a[N],b[N];
int main()
{
a[0]=2; //第一次为强化攻击,后面每两次普通攻击过后,也就是对3求余为0时为强化攻击
for(int i=1;i<N;i++)
{
if(i%3==0)a[i]=a[i-1]+2;
else a[i]=a[i-1]+1; //存下小红第i+1次攻击的伤害
}
ll n,q,h,k,x;
ll p1,p2;
scanf("%lld%lld%lld",&n,&h,&k); //怪物数量,初始血量,回血量
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p1,&p2);
ll p3;
for(int i=0;i<N;i++)
{
if(a[i]>=p1) //计算小红第几次能消灭怪物
{
p3=i;
break;
}
}
b[i]=p3*p2; // 计算小怪会对小红造成的伤害
}
sort(b+1,b+n+1); // 排序,优先击败对小红造成伤害少的小怪
scanf("%lld",&q);
while(q--)
{
scanf("%lld",&x);
ll s=h+x*k; //计算小红血量上限
ll cnt=0,sum=0;
for(int i=1;i<=n;i++)
{
sum+=b[i];
if(sum<s) //判断小红能否在死亡前击杀小怪,如果小红死了,就break;
cnt++;
else
break;
}
cout<<cnt<<" "; //cnt就是击杀小怪数量
}
return 0;
}



京公网安备 11010502036488号