潜艇的初始能量储备为
能量的消耗 (
任务成功的条件是,在穿越所有区域的整个过程中,潜艇的能量值必须始终大于 0。如果在穿越任何一个区域的过程中,潜艇的能量值
请判断,是否存在一个安全的航行顺序,能让潜艇成功完成这次探险任务。
第一行包含一个整数(
),代表测试数据的组数。
对于每组测试数据:
- 第一行包含两个整数和
(
),分别代表危险区域的数量和潜艇的初始能量。
- 接下来行,每行包含两个整数
和
(
),分别代表穿越第
个区域的能量消耗和补充量。
- 注意:每一对是绑定的,但穿越的顺序可以自由安排。
对于每组测试数据,如果存在一个安全的航行顺序,则输出 Yes ,否则输出 No 。
2 2 5 3 2 4 5 2 5 3 2 4 2
Yes No
本题由牛友@Charles 整理上传
#include <algorithm> #include <iostream> #include <vector> #include <list> using namespace std; bool cmp(const pair<int,int>& a,const pair<int,int>& b){ return (a.second-a.first)>(b.second-b.first); } bool check(long start,list<pair<int,int>>& enegy){ if(enegy.empty()) return true; for (auto it=enegy.begin(); it!=enegy.end(); it++) { pair<int,int> tmp=*it; if(tmp.first<start){ int diff=tmp.second-tmp.first; enegy.erase(it); return check(start+diff,enegy); } } return false; } int main() { int T; cin >> T; while (T--) { int origin, n; list<pair<int,int>> enegy; cin >> n >> origin; int cost,supply; for (int i = 0; i < n; i++) { cin >> cost >> supply; enegy.push_back(make_pair(cost,supply)); } enegy.sort(cmp); if(check(origin, enegy)){ cout<<"Yes"<<endl; }else{ cout<<"No"<<endl; } } }