A28818. 有一款新游戏,通关这个游戏需要完成n个任务,这n个任务可按任意次序完成,每个任务设置了启动能量值和完成任务消耗的能量值,且消耗的能量值小于等于该任务的启动能量值,如果玩家当前的能量值低于该任务启动能量值则不能开始该任务。例 1:玩家当前的能量值为 7,当前任务的启动能量值为 5,完成任务消耗的能量值为3,则可以开始该任务,完成任务后玩家剩余能量值为4例 2:玩家当前的能量值为 5,当前任…
填空题
困难
知识点
题目描述
题目描述
有一款新游戏,通关这个游戏需要完成n个任务,这n个任务可按任意次序完成,每个任务设置了启动能量值和完成任务消耗的能量值,且消耗的能量值小于等于该任务的启动能量值,如果玩家当前的能量值低于该任务启动能量值则不能开始该任务。
例 1:玩家当前的能量值为 7,当前任务的启动能量值为 5,完成任务消耗的能量值为3,则可以开始该任务,完成任务后玩家剩余能量值为4
例 2:玩家当前的能量值为 5,当前任务的启动能量值为 8,则无法开始该任务。
游戏开始时玩家需要一个初始能量值用来完成这 n个任务,当给定每个任务的启动能量值和完成任务消耗的能量值,请问初始能量的最小值是多少?
例如:n=3,这3个任务的启动能量值和完成任务消耗的能量值分别是:(2,2)、(9,5)、(7,4),那么玩家初始能量的最小值为12。可按照如下顺序完成任务:
1.完成任务(9,5),玩家剩余能量值为 7;
2.完成任务(7,4)玩家剩余能量值为 3;
3.完成任务(2,2),玩家剩余能量值为 1.
尽管最后玩家的能量值还剩余 1,但是初始能量值无法再降低,否则完成任务(9,5)后,玩家的剩余能量值会小于任务(7,4)的启动能量值,导致无法开始该任务。
输入格式
共n+1行
第一行输入一个整数n(1≤n≤105),表示游戏的任务数量
接下来n行,每行输入两个整x,y(1≤y≤x≤1000),分别表示当前任务所需的启动能量值和完成任务所消耗的能量值,整数之间以一个空格隔开
输出格式
输出一个整数,表示玩家要完成这 n个任务需要的初始能量的最小
输入样例
3
2 2
9 5
7 4输出样例
12参考答案
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Task {
int start;
int consume;
}
;
bool compareTask(const Task &a, const Task &b) {
// 启动能量值大,或者能量差值(节省)大的任务排在前面
return a.start - a.consume > b.start - b.consume;
}
int main() {
int n;
cin >> n;
vector<Task> tasks(n);
for (int i = 0; i < n; ++i) {
cin >> tasks[i].start >> tasks[i].consume;
}
// 根据启动减去消耗的值来排序任务
sort(tasks.begin(), tasks.end(), compareTask);
long long initEnergy = 0;
// 需要的最小初始能量值
long long currentEnergy = 0;
// 当前的能量值
// 从节省能量最大的任务开始
for (auto &task : tasks) {
// 如果当前能量不能启动任务,则需要增加初始能量
if (currentEnergy < task.start) {
// 增加的能量为启动能量值减去当前能量值
initEnergy += task.start - currentEnergy;
// 当前能量增加至启动能量值
currentEnergy = task.start;
}
// 启动任务后,消耗相应的能量
currentEnergy -= task.consume;
}
cout << initEnergy;
return 0;
}
上一题
下一题