# 2512. Reward Top K Students
###### tags: `Leetcode` `Medium` `Sorting` `Priority Queue`
Link: https://leetcode.com/problems/reward-top-k-students/description/
## 思路
```list.add()``` – takes O(1) time
```list.add(index, element)``` – on average runs in O(n) time
因此尽量不用第二个
按照题意来 先算出每个学生的point 然后排序即可
## Code
```java=
class Solution {
public List<Integer> topStudents(String[] positive_feedback, String[] negative_feedback, String[] report, int[] student_id, int k) {
int n = student_id.length;
Set<String> positive = new HashSet<>(Arrays.asList(positive_feedback));
Set<String> negative = new HashSet<>(Arrays.asList(negative_feedback));
int[][] points = new int[n][2];
for(int i=0; i<report.length; i++){
int point = 0;
for(String s:report[i].split(" ")){
if(positive.contains(s)) point += 3;
else if(negative.contains(s)) point -=1;
}
points[i][0] = point;
points[i][1] = student_id[i];
}
Arrays.sort(points, (a, b)->(b[0]!=a[0]?b[0]-a[0]:a[1]-b[1]));
ArrayList<Integer> ans = new ArrayList<>();
for(int i=0; i<k; i++){
ans.add(points[i][1]);
}
return ans;
}
}
```
```python=
class Solution:
def topStudents(self, positive_feedback: List[str], negative_feedback: List[str], report: List[str], student_id: List[int], k: int) -> List[int]:
stud = []
pos, neg = set(positive_feedback), set(negative_feedback)
for rep, id in zip(report, student_id):
point = 0
for s in rep.split(" "):
if s in pos: point += 3
if s in neg: point -= 1
stud.append((-point, id))
stud.sort()
return [sid for _, sid in stud[0:k]]
```