优化:黑客地球邮递员软件工程师实习生问题
Optimize: Hackerearth Postman Software engineer intern question
你想买一台笔记本电脑。每台笔记本电脑有两个参数:评级和价格。您的任务是在给定价格范围内购买评分最高的笔记本电脑。给定 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
我的方法
-
构建(键、值(映射
-
而 Y--> X 做,
迭代器 = map.find(Y(
如果 iterator,则 max_rating = max(max_rating, iterator.value(
-
返回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( 中运行。
有关上述问题,请参阅下面的代码。我在考试中努力解决它。
程序的任务:
根据价格对- 价格和评级向量进行排序。
- 根据"sl,sr指数之间的最大额定值"制作段树
- 在查询低价和查询高价之间获取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;
}
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 用于在并发环境中访问 MMIO 的软件模式
- 有没有办法实现 fmu 导出到基于 c++ 的仿真软件以使用 fmi?
- 从C++调用 Python 并访问通过 Anaconda 安装的软件包
- 有关图像处理应用程序的硬件和软件安全性的建议
- 通过自制软件(macOS)安装的clang++:编译错误
- 如何在软件代码中使用ofstream创建文件
- 如何在Linux上正确发布C++软件(游戏)
- 尝试使用 RTool 在 R4.0 上安装软件包时出现编译错误
- 如果 (cin) { while(cin) ..工程?
- Visual Studio Code输出被检测为恶意软件?
- 如何使用自制软件,cMake和cLion将库添加到C++项目中
- 我正在尝试编写将 ASCII 转换为十进制、添加并转换回 ASCII 的软件
- 在 C/C++ 中,是否可以通过使用指针更改"important"内存地址的值来创建简单的恶意软件?
- 使用策略模式设计软件时出现的问题
- 为什么 Avira 认为"CoCreateInstance()"是恶意软件?
- 在陈述"Implementation-defined"时,什么样的软件是"Implementation"的一部分?究竟什么是"Implementation"?
- 如何将不可编译的配置文件添加到QT工程中?
- 优化:黑客地球邮递员软件工程师实习生问题
- 使用工程空间在软件包中导入的线性代数库EIGEN