题目信息
小张最近沉迷上一款手机游戏北理工的恶龙。在这个游戏中你通过提升攻击力击败恶龙,打败所有恶龙后你可以获得游戏的胜利。
在这款游戏中,每一条恶龙有一个难度值 x 和一个经验值 y 。游戏中的英雄具有攻击力 A 。游戏一开始英雄的攻击力 A=0 。打到一条恶龙你的攻击力需要大于难度值 x 。在你击败恶龙以后,你的攻击力会增加经验值 y 。
当然,你有时需要额外提升你的攻击力,此时你只需氪金1元,就能增长一点攻击力。小张想知道,如果他自己决定挑战恶龙的顺序,要想击败所有恶龙至少需要氪金多少钱?
输入
第一行一个数 n (1 ≤ n ≤ 200000 )
接下来 n 行每行两个数 x,y (0 ≤ x ≤ 1000000, -1000000 ≤ y ≤ 1000000 )
输出
一个整数,表示小张最少需要氪金多少钱。
提示
直接打败第一条恶龙,此时 A=1 ,花费0元。
直接打败第二条恶龙,此时 A=2 ,花费0元。
氪金3元,此时 A=5 ,打败第三条恶龙,此时 A=3 。
最后直接打败第四条恶龙。
测试样例
4
0 1
1 1
5 -2
2 -1
3
解答
#include <bits/stdc++.h>
using namespace std;
struct Dragon
{
int x;
int y;
};
struct Rulex
{
bool operator()(const Dragon &a, const Dragon &b)
{
return a.x < b.x;
}
};
struct Rulexy
{
bool operator()(const Dragon &a, const Dragon &b)
{
if (a.x + a.y == b.x + b.y)
{
return a.x > b.x;
}
else
{
return a.x + a.y > b.x + b.y;
}
}
};
int main()
{
ios::sync_with_stdio(false);
//freopen("E://test.txt", "r", stdin);
int n;
cin >> n;
Dragon zengjia[200000];
int a = 0;
Dragon jianshao[200000];
int b = 0;
for (int i = 0; i < n; i++)
{
int tmpx, tmpy;
cin >> tmpx >> tmpy;
if (tmpy < 0)
{
jianshao[b].x = tmpx;
jianshao[b].y = tmpy;
b++;
}
else
{
zengjia[a].x = tmpx;
zengjia[a].y = tmpy;
a++;
}
}
sort(zengjia, zengjia + a, Rulex());
sort(jianshao, jianshao + b, Rulexy());
long long nengli = 0;
long long money = 0;
for (int i = 0; i < a; i++)
{
//先杀给经验的龙
if (nengli >= zengjia[i].x)
{
//能杀的龙
nengli += zengjia[i].y;
}
else
{
//杀不了的
money += zengjia[i].x - nengli;
nengli = zengjia[i].x + zengjia[i].y;
}
}
for (int i = 0; i < b; i++)
{
//后杀损失经验的龙
if (nengli >= jianshao[i].x)
{
//能杀的龙
nengli += jianshao[i].y;
}
else
{
//杀不了的
money += jianshao[i].x - nengli;
nengli = jianshao[i].x + jianshao[i].y;
}
}
cout << money << endl;
return 0;
}