测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题