给定的阵列ARR [] []由N对,使得每一对{L,R}代表第i个房子可以在天的L个第一天涂在R之前,任务是找到房子的最大数目可以连续绘制。
例子:
Input: N = 4, paint[ ][ ] = [[1, 19], [2, 2], [4, 17], [1, 1]]
Output: 3
Explanation: Maximum of three houses can be painted and order is {4, 3, 1}
Input: N = 4, paint[ ][ ] = [[100, 210], [200, 1310], [1000, 1275], [2500, 3000]]
Output: 3
方法:该问题可以使用贪心方法解决。这个想法是从当前 LastDay 中最低的 DaysRequired 中进行选择。请按照以下步骤操作。
- 初始化一个向量,比如V,来存储所有可以取的对。
- 使用比较器pair.second小于pair.first对向量V 进行排序
- 初始化一个优先级队列pq并推送向量V 的第一对。
- 初始化一个变量,比如t ,以存储时间。
- 遍历向量V并将当前对放入优先级队列pq 中:
- 如果t+DaysRequired小于或等于LastDay ,则继续。
- 否则,从优先级队列中弹出,存储在临时变量中并更新t等于t – temp.first
- 最后,返回优先级队列的大小。
下面是上述方法的实现:
C++14
// C++ prograam for the above approach
#include
using namespace std;
typedef vector > Matrix;
// Comparator for sorting
static bool cmp(pair a, pair b)
{
return a.second < b.second;
}
// Function to count number of houses
// that can be painted
void countMaxPinted(int n, Matrix& paint)
{
// Vector to store the pairs
vector > V;
for (int i = 0; i < n; i++) {
// If house can be painted
if (paint[i][0] <= paint[i][1]) {
V.push_back(make_pair(paint[i][0], paint[i][1]));
}
}
// Sort the vector
sort(V.begin(), V.end(), cmp);
// If vector is empty
if (V.size() == 0) {
cout << 0 << endl;
return;
}
// Initialize t
int t = V[0].first;
// Initialize priority queue
priority_queue > pq;
pq.push(V[0]);
// Traversing the vector
for (int i = 1; i < V.size(); i++) {
t += V[i].first;
// Pushing in Vectors
pq.push(V[i]);
if (t <= V[i].second) {
continue;
}
else {
// Pop the top element
auto temp = pq.top();
pq.pop();
t = t - temp.first;
}
}
// Print the ans
cout << pq.size() << endl;
}
// Driver Code
int main()
{
// Given Input
int n = 4;
Matrix paint = { { 1, 19 }, { 2, 2 }, { 4, 17 }, { 1, 1 } };
// Function Call
countMaxPinted(n, paint);
}
输出
3
时间复杂度: O(NlogN)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。