“绘图修复”的更好方法

时间:2016-11-03 14:27:10

标签: c++ algorithm vector

最近我遇到了这个问题[评论中的链接],这里有摘录,

  

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;
}

注意:不幸的是由于我的声誉,我无法直接发布图片,我也无法发布多个链接,对不起

0 个答案:

没有答案