在被怪兽之王击败后,泰罗奥特曼回到了M78M78星云疗伤,在这段时间内,地球上怪兽肆虐,给人类的生存带来了极大威胁,奥特之母将手镯皇冠送给泰罗,使他的能力大幅度提高,这一次,泰罗决定一雪前耻。
地球上现在有nn只怪兽,每只怪兽都有一个闪避值x和生命值y,只有泰罗的命中值大于等于怪兽的闪避值时,怪兽才能被击中。而由于奥特曼只能在地球上活动3分钟,所以泰罗只有p点能量,每次攻击会消耗一点能量,然后造成1点伤害。泰罗的初始命中值只有h,而在得到皇冠手镯的加成后,增加了b点命中值。 为了救更多的人,泰罗必须尽可能杀死更多的怪兽。
输入格式
第一行4个整数,n,p,h,b分别表示怪兽的数量,泰罗的能量,初始命中值和皇冠buff加成
接下来是n行,每行两个整数x,y,分别表示每个怪兽的闪避值和血量
输出格式
一个整数,表示泰罗杀死的怪兽数量
数据范围
1<=n<=4000,1<=p<=1000,1<=h,b<=200,1<=x<=300,1<=y<=50
样例输入1
5 10 50 50
120 1
110 2
100 4
80 7
90 6
样例输出1
2
样例输入2
6 20 60 30
70 2
100 1
89 1
55 2
90 1
77 2
样例输出2
5
方法一:固定数组大小
#include<stdio.h>
int main()
{
//怪物的数量,泰罗的能量,初始命中值和皇冠buff加成
int n, p, h, bn;
int life, speed, temp;
int count = 0, sum = 0;
scanf("%d %d %d %d", &n, &p, &h, &bn);
int arr[5001];
for (int i = 0;i < n;i++)
{
scanf("%d %d", &speed, &life);
if (speed <= h + bn)
{
arr[count] = life;
count++;
}
}
for (int i = 0;i < count - 1;i++)
{
for (int j = 0;j < count - 1 - i;j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0;i < count;i++)
{
if (p >= arr[i])
{
sum++;
p -= arr[i];
}
}
printf("%d", sum);
return 0;
}
方法二:动态内存分配
#include<stdio.h>
#include<stdlib.h>
struct Base
{
int speed;//闪避
int attach;//生命
};
struct Monster//怪兽
{
int n;
struct Base *Attribute;//属性
};
int main()
{
//泰罗的能量,初始命中值和皇冠buff加成
int p, h, bn;
int count=0;
//杀死的总数
int sum = 0;
struct Monster mon;
struct Monster mon2;
struct Base tem;
struct Base god;
struct Monster*ps = &mon;
struct Monster* ps2 = &mon2;
scanf("%d %d %d %d", &mon.n,&p, &h, &bn);
ps->Attribute= (struct Base*)malloc(mon.n * sizeof(struct Base));
ps2->Attribute = (struct Base*)malloc(mon.n* sizeof(struct Base));
if (ps->Attribute == NULL|| ps2->Attribute == NULL)
return 0;
for (int i = 0;i < mon.n;i++)
scanf("%d %d", &ps->Attribute[i].speed, &ps->Attribute[i].attach);
god.attach = p;
god.speed = h + bn;
for (int k = 0;k < mon.n;k++)
{
if (ps->Attribute[k].speed<= god.speed)
{
ps2->Attribute[count] = ps->Attribute[k];
count++;
}
}
for(int i=0;i<count-1;i++)
for (int j = 0;j < count - 1 - i;j++)
if (ps2->Attribute[j].attach>ps2->Attribute[j+1].attach)
{
tem = ps2->Attribute[j+1];
ps2->Attribute[j+1] = ps2->Attribute[j];
ps2->Attribute[j] = tem;
}
for (int i = 0;i < count;i++)
if (god.attach >= ps2->Attribute[i].attach && god.attach >= 0)
{
god.attach -= ps2->Attribute[i].attach;
sum++;
}
printf("\n%d", sum);
return 0;
}