c语言编程训练4——排序贪心算法

在被怪兽之王击败后,泰罗奥特曼回到了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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值