Алиса играет в аркадную игру и хочет подняться на вершину списка лидеров и хочет отследить ее рейтинг. Его таблица лидеров работает следующим образом:
- Игрок с наибольшим количеством очков занял место в списке лидеров.
- Игроки, имеющие одинаковые очки, получают такой же номер рейтинга, и следующий игрок (и) ) получить сразу следующий номер рейтинга.
Например, четыре игрока в таблице лидеров имеют высокие баллы 100, 90, 90 и 80. Эти игроки будут иметь ранг 1, 2, 2 и 3 соответственно. Если Алиса набрала 70, 80 и 105 баллов, то после каждой игры ее рейтинг будет 4-м, 3-м и 1-м.
#include <bits/stdc++.h>
using namespace std;
struct table{
int rank;
int score;
};
Это модифицированная функция двоичного поиска для поиска по партитуре.
int search(vector<table> v,int low,int high,int n,int x){
if(low<=high){
int mid =(high+low)/2;
if((v[mid].score==x) || (mid==0 && v[mid].score<x))
return v[mid].rank;
if(mid==n-1 && v[mid].score>x)
return (v[mid].rank + 1);
if(v[mid].score>x && x>v[mid+1].score && mid<n-1)
return v[mid+1].rank;
if(v[mid].score>x)
return search(v,mid+1,high,n,x);
else
return search(v,low,mid-1,n,x);
}
return -1;
}
Основные функции скалолазания Leaderboard
vector<int> climbingLeaderboard(vector<int> scores, vector<int> alice) {
vector<table> v;
vector<int> res;
int n = scores.size();
int m = alice.size();
int x=1;
for(int i=0 ; i<n ; i++){
if(scores[i]!=scores[i-1] && i>0)
x++;
v[i].rank = x;
v[i].score = scores[i];
}
int z;
for(int i=0 ; i<m ; i++){
x=alice[i];
z = search(v,0,n-1,n,x);
res.push_back(z);
}
return res;
}
Программа драйверов
int main(){
int scores_count;
cin >> scores_count;
vector<int> scores; `//vector for storing leaderboard scores`
int k;
for(int i=0 ; i<scores_count ; i++){
cin >> k;
scores.push_back(k);
}
int game_count; `//number of games played by alice`
vector<int> Alice; `//vector for storing Alice's scores`
for(int i=0 ; i<game_count ; i++){
cin >> k;
alice.push_back(k);
}
vector<int> result; `//vector for storing result rank of each game of Alice`
result = climbingLeaderboard(scores,alice);
for(auto i = result.begin() ; i!=result.end() ; i++){
cout << *i << endl;
}
return 0;
}