【发布时间】:2020-01-29 03:11:50
【问题描述】:
您想购买一台笔记本电脑。每台笔记本电脑都有两个参数:评级和价格。您的任务是购买给定价格范围内评级最高的笔记本电脑。给定 Q 个任务,每个查询都包含所需的价格范围,您必须打印在该价格范围内可以购买的评分最高的笔记本电脑。
输入格式:
第一行包含 N 表示输入的数量。
以下 N 行包含 P&R,表示笔记本电脑的价格和范围。
下一行包含 Q 表示查询的数量。
以下 Q 行包含两个整数 X 和 Y,表示价格范围(含)。
输出格式:
对于每个任务 Q,打印该范围内可以购买的最高评分。
如果您无法在该范围内获得任何笔记本电脑,请打印 -1。
约束:
1
0
1
时间限制:每个输入 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)
如果是迭代器,那么,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(超出时间限制)而失败。很高兴知道更好的解决方案。
【问题讨论】:
-
我想不出任何其他的解决方案 -- 如果你真的相信你所需要的只是一点优化,这个:
map<int,int> price_rating;可能是std::unordered_map<int,int>。另外,通过const reference传递你的向量,而不是通过值。 -
您可以有一个排序的价格列表(连同评级)。当您获得一个范围时,您可以从最低价格到最高价格在列表中进行交互并找到最高评级。如果 min 到 max 之间的列表长度为 0,则可以返回 -1。
-
@YuvrajJaiswal 只要你有一个排序数组,你就可以使用二分搜索。
-
@Jason 想到了这一点,但我们有一个按价格排序的数组,我们需要找到最高评分。我们将无法决定在二分搜索中向哪个方向移动。
标签: c++ algorithm dictionary optimization