目录
记录程设首次从头到尾没查过资料亲手一个小时弄出来一道题
思路
这题其实也简单,sort函数yyds !
简单在哪里呢?
首先你已经具备了归并或者qsort或者sort的基础,排序已经没问题了。
其次是通过观察用例,你发现正经验正着sha,负经验反正sha是最好的,所以逻辑就很明了了。
注意避坑:
- 负经验要用经验和等级之和排序,正的只需要用等级排即可。
- 先打正再打负和先打负再打正不同。大概率是先打正好,因为先负后正,最后人物经验会很高,是一种浪费。出于谨慎,我设置了两轮计算,取最小值,实际上我试过只需要一轮即可。
- 数据类型。首先要明确,凡是累加的,一律开到最大的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; //这个排序很阴间。
}