【第十五题】北理工的恶龙|贪心(北理工/北京理工大学/程序设计方法与实践/小学期 )

目录

思路

注意避坑:

 代码:


记录程设首次从头到尾没查过资料亲手一个小时弄出来一道题 

思路

这题其实也简单,sort函数yyds !

简单在哪里呢?

首先你已经具备了归并或者qsort或者sort的基础,排序已经没问题了。

其次是通过观察用例,你发现正经验正着sha,负经验反正sha是最好的,所以逻辑就很明了了。

注意避坑:

  1.  负经验要用经验和等级之和排序,正的只需要用等级排即可。
  2.  先打正再打负和先打负再打正不同。大概率是先打正好,因为先负后正,最后人物经验会很高,是一种浪费。出于谨慎,我设置了两轮计算,取最小值,实际上我试过只需要一轮即可。
  3. 数据类型。首先要明确,凡是累加的,一律开到最大的long long,其他的看数据而定。

 代码:

#include<cstdio>
#include<algorithm>
#define SIZE 200010
typedef struct {
	int x;
	int y;
}dragon;
bool cmp(dragon dr1, dragon dr2);
dragon up[SIZE];
dragon down[SIZE];
int main(void)
{
	//freopen("input.txt", "r", stdin);
	int n, i, upnum, downnum;
	long long A = 0, money = 0, temp_money, min_money;
	dragon temp;
	scanf("%d", &n);
	for (i = 0, upnum = 0, downnum = 0; i < n; i++)
	{
		scanf("%d%d", &temp.x, &temp.y);
		if (temp.y >= 0)//up可以有0经验
			up[upnum++] = temp;
		else
			down[downnum++] = temp;
	}
	//读入正确,upnum记录up数组的实际长度,downnum记录down数组实际长度
	//排序
	std::sort(up, up + upnum, cmp);
	std::sort(down, down + downnum, cmp);
	//up正,down倒无误
	// 	   检验代码
	//for (i = 0; i < upnum; i++)
	//	printf("%d %d ", up[i].x, up[i].y);
	//putchAr('\n');
	//for (i = 0; i < downnum; i++)
	//	printf("%d %d ", down[i].x, down[i].y);
	//开始计分氪金
	for (i = 0; i < upnum; i++)
		if (A >= up[i].x)
			A += up[i].y;
		else
		{
			temp_money = up[i].x - A;
			money += temp_money;
			A += temp_money; //提升A有money和经验			
			A += up[i].y;
		}
	for (i = 0; i < downnum; i++)
		if (A >= down[i].x)
			A += down[i].y;
		else
		{
			temp_money = down[i].x - A;
			money += temp_money;
			A += temp_money;
			A += down[i].y;
		}
	min_money = money;
	//先负后正看起来可有可无
	//money = 0; A = 0;
	//for (i = 0; i < downnum; i++)
	//	if (A >= down[i].x)
	//		A += down[i].y;
	//	else
	//	{
	//		temp_money = down[i].x - A;
	//		money += temp_money;
	//		A += temp_money;
	//		A += down[i].y;
	//	}
	//for (i = 0; i < upnum; i++)
	//	if (A >= up[i].x)
	//		A += up[i].y;
	//	else
	//	{
	//		temp_money = up[i].x - A;
	//		money += temp_money;
	//		A += temp_money; //提升A有money和经验			
	//		A += up[i].y;
	//	}
	//min_money = min_money < money ? min_money : money;
	//输出
	printf("%lld\n", min_money);

	return 0;
}
bool cmp(dragon dr1, dragon dr2)
{
	if (dr1.y >= 0)//对应up数组
		return dr1.x < dr2.x; //如果up的前一个小于后一个,就保留
	else
		return dr1.x + dr1.y > dr2.x + dr2.y; //这个排序很阴间。
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦梦亦醒乐逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值