最近我遇到了这个问题[评论中的链接],这里有摘录,
Siruseri恰好拥有印度和印度最好的国际象棋选手 Siruseri体育日历中最重要的事件之一是 来自Siruseri和Navalur的年度国际象棋挑战赛 竞争。
该活动在Siruseri和Navalur交替举行。今年了 锦标赛将在Sirseri和Siruseri秘书举行, 今年有谁再次当选,想确保获胜 Siruseri。自从开始战争或指责Navalur拥有 大规模杀伤性武器超出了他的范围(他也有一些 他决定,更多的脑细胞比自由世界的普通领导者更多 做一些聪明的事。绘制修复!!
要了解他打算做什么,我们需要知道国际象棋如何 挑战赛有组织。 Siruseri和Navalur都必须这样做 发送N个玩家。两支球队的每位球员都参加了比赛 一场比赛(所以正好打了N场比赛)。预计主持人 抽签决定谁扮演谁。我们的秘书计划解决这个问题 绘制,以便配对完全符合他的要求。
每位国际象棋选手都有ELO评分,表明他有多好。该 评分越高,玩家越好。秘书知道 Siruseri和Navalur队的每名球员和他的评分 想把它们配对,以便在其中配对的数量 Siruseri球员的ELO评分最高。
例如,假设N为4且玩家的等级为 下面:
Table showing ELO Ratings against players
然后,秘书可以安排Siruseri获得更高的评级 在4场比赛中有3场比赛。他可以做到这一点,例如,将它们配对 (1,2),(2,4),(3,3)和(4,1),其中(i,j)表示玩家i来自 Siruseri扮演来自Navalur的球员j。这是他能做的最好的事情 来自Siruseri的球员可以击败来自Navalur的球员。
你的任务是帮助秘书找到最大化的配对 Siruseri评级较高的一对。
到目前为止,这么好,可以做一个算法,而不是尝试两种方法来实现,但都是徒劳的,理论上讲我无法发现这个算法有什么问题。但可能是我不太了解的一些极端情况,任何人都可以有更好的方法解决这个问题吗?
以下是我的工作(评论中的代码是我正在谈论的另一种方法),
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
bool ordering(const std::pair<int,int>first,const std::pair<int,int>second){
return first.second > second.second;
}
int main(){
int n;
std::cin >> n;
std::vector<std::pair<int,int> >home(n);
std::vector<std::pair<int,int> >visitors(n);// Pair for maintaining the index when they are sorted
for(int i=0;i<n;i++){
std::cin >> home[i].second;
home[i].first = i;// first one in the index , next comes the ELO rating for the player
}
for(int i=0;i<n;i++){
std::cin >> visitors[i].second;
visitors[i].first = i;
}
sort(home.begin(),home.end(),ordering);
sort(visitors.begin(),visitors.end(),ordering);// both the teams are sorted
/*for(int i=0;i<n;i++){
std::cout << home[i].first+1 << ' ' << visitors[i].first+1 << std::endl;
}*/
std::vector<int>greater(n,-1);
std::vector<int>remaining;
int sizeG = 0;
int sizeR = 0;
/* int size = 0;
int i=0,j=0,k=n-1; //Another process copied from a solution , simillar to mine one but still it doesnt works
while(j<n){
if(home[i].second < visitors[j].second){
greater[home[k].first] = visitors[j].first;
j++;k--;
}else{
greater[home[i].first] = visitors[j].first;
i++;j++;size++;
}
}
std::cout << size << std::endl;
for(int i=0;i<n;i++){
std::cout << greater[i]+1<< std::endl;
}*/
for(int i=0;i<n;i++){
if(visitors[i].second < home[sizeG].second){
//std::cout << visitors[i].second << ' ' << home[sizeG].second << ' ' << home[sizeG].first << std::endl;
greater[home[sizeG].first] = visitors[i].first+1;
//std::cout<< home[sizeG].first+1 << ' ' <<visitors[i].first+1 << std::endl;
sizeG++;
}else{
remaining.push_back(visitors[i].first+1);
sizeR++;
}
}
std::cout << sizeG << std::endl;
//std::cout << std::endl;
int j=sizeR-1;
for(int i=0;i<n;i++){
if(greater[i] == -1){
greater[i] = remaining[j];
j--;
}
std::cout << greater[i] << std::endl;
}
/*std::cout << std::endl;
for(int i=0;i<sizeR;i++){
std::cout << remaining[i] << std::endl;
}*/
return 0;
}
注意:不幸的是由于我的声誉,我无法直接发布图片,我也无法发布多个链接,对不起