优化:黑客地球邮递员软件工程师实习生问题

Optimize: Hackerearth Postman Software engineer intern question

本文关键字:软件工程 工程师 实习生 问题 软件 邮递员 黑客 地球 优化      更新时间:2023-10-16

你想买一台笔记本电脑。每台笔记本电脑有两个参数:评级和价格。您的任务是在给定价格范围内购买评分最高的笔记本电脑。给定 Q 任务,每个查询都包含所需的价格范围,您必须打印在该价格范围内可以购买的最高评级笔记本电脑。

输入格式:

第一行包含 N 表示输入数。

以下N行包含P&R,表示笔记本电脑的价格和范围。

下一行包含表示查询数的 Q。

以下Q线包含两个整数X和Y,表示价格范围(含(。

输出格式:

对于每个任务 Q,打印可在该范围内购买的最高评级。

如果您无法获得该范围内的任何笔记本电脑,请打印 -1。

约束:

1 <= N, Q <= 10^6

0 <= R,P <= 10^9

1 <= X <= Y <= 10^9

时间限制:每次输入 6 秒

示例输入:

5
1000 300
1100 400
1300 200
1700 500
2000 600
3
1000 1400
1700 1900
0 2000

示例输出:

400
500
600

我的方法

  1. 构建(键、值(映射

  2. 而 Y--> X 做,

    迭代器 = map.find(Y(

    如果 iterator,则 max_rating = max(max_rating, iterator.value(

  3. 返回max_rating

这是我的解决方案

int solve(vector<int> P, vector<int> R, int X, int Y)
{
int max_value=-1;
map<int,int> price_rating;
for(int i=0;i<N;i++)
{
price_rating.insert(pair<int, int>(P[i],R[i]));
}
while(y>x)
{
auto iterator = price_rating.find(y);
if(iterator!=price_rating.end())
{
max_rating = max(max_rating,iterator->second);
}
y-=1;
}
return max_rating;
}

只有少数测试用例使用上述解决方案通过,而其他测试用例由于TLE(超出时间限制(而失败。知道更好的解决方案会很棒。

查看段树。

这个想法是首先构建一个段树,其中每个节点代表一个价格范围并存储该范围的最高评级。

例如,如果数据有 7 个价格,{10, 20, 30, 40, 50, 60, 70},则可以使用以下节点创建一个树:

[10-70]
/        
[10-30]        [40-70]
/               /      
[10-20]   [30]  [40-50]    [60-70]
/               /         /   
[10]  [20]      [40]  [50]  [60]  [70]

叶子是"范围",只有一个价格。您可以在此树上冒泡最大评级,因此每个节点都将具有该特定范围的最大评级。

然后,对于实际查询,您可以沿着树向下走(深度优先搜索(,并且:

  • 排除通过其范围与查询范围不重叠的节点的路径
  • 当存在部分重叠时,继续向下钻取(扩展路径(
  • 范围完全在查询范围内的节点上停止和回溯

最终,您将最终到达共同构成查询范围的节点。从这些节点获得最大评级,同时从递归回溯。

这将使查询在 O(logn( 中运行。

有关上述问题,请参阅下面的代码。我在考试中努力解决它。

程序的任务:

根据价格对
  1. 价格和评级向量进行排序。
  2. 根据"sl,sr指数之间的最大额定值"制作段树
  3. 在查询低价和查询高价之间获取MaxRating时,只需检查当前节点是否包含该价格,并据此返回答案。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct mydtype
{
int price;
int rating;
};
bool comp( mydtype a, mydtype b ){
if( a.price != b.price ) return a.price<b.price;
else return a.rating<b.rating;
}
int getMid( int a , int b ){
return a+(b-a)/2;
}
void build( int st[], vector<mydtype> v, int si, int sl, int sr ){
if(sl==sr) st[si]=v[sl].rating;
else{
int mid=getMid(sl,sr);
build(st,v,2*si+1,sl,mid);
build(st,v,2*si+2,mid+1,sr);
st[si]=max( st[2*si+1], st[2*si+2] );
}
}
int getMaxRating(int st[], vector<mydtype> v , int si, int sl, int sr, int queryLowPrice, int queryHighPrice ){
if( queryLowPrice > queryHighPrice ) return -1;
int stLowPrice = v[sl].price;
int stHighPrice = v[sr].price;
if( queryLowPrice > stHighPrice || queryHighPrice < stLowPrice ) return INT_MIN;
if( stLowPrice>= queryLowPrice && stHighPrice <= queryHighPrice ) return st[si];
else{
int mid = getMid(sl,sr);
return max( getMaxRating( st, v, 2*si+1, sl, mid, queryLowPrice, queryHighPrice ),
getMaxRating( st, v, 2*si+2, mid+1, sr, queryLowPrice, queryHighPrice ) );
}
}
int main ()
{
int n = 5;
vector < mydtype > v(n);
v={{10,2}, {20,3}, {20,4}, {30,4}, {40,2}};
sort(v.begin(),v.end(), comp);
int max_size = 15;
int st[max_size];
build (st, v, 0, 0, n-1 ); 
cout<< getMaxRating(st, v, 0, 0, n-1, 19, 21);
return 0;
}