题目地址
假设当前最少能完成所需的能量为P.
且:当前任务的序列为(a1,m1) … (a2,m2)…(an,mn)
则
p >=
m
1
m_1
m1
p >=
a
1
a_1
a1 +
m
2
m_2
m2
p >=
a
1
a_1
a1 +
a
2
a_2
a2 +
m
3
m_3
m3
p >= … +
a
n
−
1
a_{n-1}
an−1 +
m
n
m_n
mn
假设:
当前的两个状态是。
p >=
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
m
n
m_{n}
mn
p >=
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
a
n
a_{n}
an +
m
n
+
1
m_{n+1}
mn+1
将它们交换后:
p >=
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
m
n
+
1
m_{n+1}
mn+1
p >=
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
a
n
+
1
a_{n+1}
an+1 +
m
n
m_{n}
mn
其它的情况的无影响
假设交换前更优
则max(
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
m
n
m_{n}
mn ,
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
a
n
a_{n}
an +
m
n
+
1
m_{n+1}
mn+1) <= max(
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
m
n
+
1
m_{n+1}
mn+1 ,
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
a
n
+
1
a_{n+1}
an+1 +
m
n
m_{n}
mn)
则
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
a
n
a_{n}
an +
m
n
+
1
m_{n+1}
mn+1 <=
a
1
a_1
a1 +
a
2
a_2
a2 + …+
a
n
−
1
a_{n-1}
an−1 +
a
n
+
1
a_{n+1}
an+1 +
m
n
m_{n}
mn
即
a
n
a_{n}
an +
m
n
+
1
m_{n+1}
mn+1 <=
a
n
+
1
a_{n+1}
an+1 +
m
n
m_{n}
mn
故
a
n
a_{n}
an -
m
n
m_{n}
mn <=
a
n
+
1
a_{n+1}
an+1 -
m
n
+
1
m_{n+1}
mn+1
所以我们只需要将它们按这个排序就行了。
class Solution {
public:
static bool cmp(vector<int>& a,vector<int>& b){
return a[0] - a[1] < b[0] - b[1];
}
int minimumEffort(vector<vector<int>>& tasks) {
sort(tasks.begin(),tasks.end(),cmp);
int res = 0,ma = 0;
for(int i=0;i<(int)tasks.size();++i){
ma = max(ma,tasks[i][1]+res);
res += tasks[i][0];
}
return ma;
}
};