Given a list of items and their values. The task is to find top k items with the highest value. It is possible that two items have the same value, in that case item whose name comes first (lexicographically) will be given higher priority.

**Examples:**

Input:items[] = {Bat, Gloves, Wickets, Ball}, values[] = {100, 50, 200, 100}

k = 2

Output:Wickets Ball

Wickets has the highest value.

Bat, Ball has the same value but Ball comes first lexicographically.

**Approach:** This question can be solved by picking the items greedily according to the values. We will sort use the items list in the decreasing order of the values and in case of the same values items will be sorted lexicographical order increasing order.

We will store the data in the form of pairs in a vector and will use an inbuilt sort function with boolean comparator function which will be used to compare two items.

Below is the implementation of the above approach:

`// C++ implementation of above approach ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Boolean Comparator Function ` `// to compare two pairs of item-value ` `bool` `comp(pair<string, ` `int` `> A, pair<string, ` `int` `> B) ` `{ ` ` ` `// Compare the name if the values are equal ` ` ` `if` `(A.second == B.second) ` ` ` `return` `A.first < B.first; ` ` ` ` ` `// Else compare values ` ` ` `return` `A.second > B.second; ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `int` `k = 2; ` ` ` `int` `n = 3; ` ` ` ` ` `// Store data in a vector of Item-Value Pair ` ` ` `vector<pair<string, ` `int` `> > items; ` ` ` ` ` `// inserting items-value pairs in the vector ` ` ` `items.push_back(make_pair(` `"Bat"` `, 100)); ` ` ` `items.push_back(make_pair(` `"Gloves"` `, 50)); ` ` ` `items.push_back(make_pair(` `"Wickets"` `, 200)); ` ` ` `items.push_back(make_pair(` `"Ball"` `, 100)); ` ` ` ` ` `// Sort items using Inbuilt function ` ` ` `sort(items.begin(), items.end(), comp); ` ` ` ` ` `// Print top k values ` ` ` `// or if n is less than k ` ` ` `// Print all n items ` ` ` `for` `(` `int` `i = 0; i < min(n, k); ++i) { ` ` ` `cout << items[i].first << ` `'\n'` `; ` ` ` `} ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

Wickets Ball

**Time Complexity:** O(NlogN)

Further Optimization : We can further optimize above solutions using Heap Data Structure. Please see k largest elements in an array.

## Recommended Posts:

- Get maximum items when other items of total cost of an item are free
- Minimum difference between the highest and the smallest value of mines distributed
- Difference between highest and least frequencies in an array
- Maximum length substring with highest frequency in a string
- Highest power of 2 that divides a number represented in binary
- Longest prefix in a string with highest frequency
- Find K items with the lowest values
- Find the maximum possible value of the minimum value of modified array
- Maximum number of groups of size 3 containing two type of items
- Check if two items can be selected from two different categories without exceeding price
- Minimum number of distinct elements after removing m items
- Minimum number of items to be delivered
- Randomly select items from a List in Java
- Buy minimum items without change and given coins
- Ways to place 4 items in n^2 positions such that no row/column contains more than one
- Maximum items that can be bought with the given type of coins
- Difference between dict.items() and dict.iteritems() in Python
- Maximum profit by selling N items at two markets
- Maximum items that can be bought from the cost Array based on given conditions
- Count of ways to distribute N items among 3 people with one person receiving maximum

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.