Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为';图纸固定';_C++_Algorithm_Vector - Fatal编程技术网

C++ 为';图纸固定';

C++ 为';图纸固定';,c++,algorithm,vector,C++,Algorithm,Vector,最近我遇到了这个问题[评论中的链接],这里有一个摘录 Siruseri碰巧有一些印度和印度最好的棋手 Siruseri体育日历中最重要的事件之一是 一年一度的国际象棋挑战赛,来自Siruseri和Navalur的团队 竞争 该活动在Siruseri和Navalur轮流举行。今年 比赛将在Sirseri举行,Siruseri的秘书, 谁将参加今年的连任,谁愿意确保选举获胜 西尔乌里。自从发动战争或指控纳瓦卢拥有 大规模杀伤性武器超出了他的范围(他也有一些武器) (比自由世界的平均领导人还要多的脑细

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

Siruseri碰巧有一些印度和印度最好的棋手 Siruseri体育日历中最重要的事件之一是 一年一度的国际象棋挑战赛,来自Siruseri和Navalur的团队 竞争

该活动在Siruseri和Navalur轮流举行。今年 比赛将在Sirseri举行,Siruseri的秘书, 谁将参加今年的连任,谁愿意确保选举获胜 西尔乌里。自从发动战争或指控纳瓦卢拥有 大规模杀伤性武器超出了他的范围(他也有一些武器) (比自由世界的平均领导人还要多的脑细胞)他决定 做些聪明的事。绘图修正

要理解他打算做什么,我们需要知道国际象棋是如何下棋的 挑战赛是有组织的。Siruseri和Navalur都需要 派遣N名球员。两个队的每个球员都参加了比赛 一个游戏(因此正好玩了N个游戏)。预计主持人将 抽签决定谁打谁。我们的秘书计划解决这个问题 画,使配对完全符合他想要的

每个棋手都有一个ELO等级,表明他有多优秀。这个 评级越高,球员表现越好。局长知道这个问题 Siruseri和Navalur团队中每位球员的评级,以及他 希望将它们配对,以便 Siruseri玩家的ELO等级最高

例如,假设N为4,玩家的评级为 下:

然后,部长可以安排Siruseri获得更高的评级 4场比赛中有3场。例如,他可以通过将它们配对为 (1,2)、(2,4)、(3,3)和(4,1),其中(i,j)指来自 Siruseri扮演纳瓦卢的球员j。这是他能做的最好的了 来自Siruseri的玩家可以击败来自Navalur的玩家1

你的任务是帮助秘书找到一个能最大限度提高效率的配对 Siruseri具有更高评级的对数

到目前为止还不错,我能编出一个算法,然后尝试了两种方法来实现它,但都是徒劳的,从理论上讲,我找不到这个算法有任何错误。但可能是一些我不太了解的角落案例,有谁能有更好的方法解决这个问题吗

以下是我所研究的(注释中的代码是我所说的另一种方法)

#包括
#包括
#包括
#包括
布尔排序(常数std::pairfirst,常数std::pairsecond){
返回first.second>second.second;
}
int main(){
int n;
标准:cin>>n;
std::矢量家(n);
std::vectorvisitors(n);//用于在排序时维护索引的对
对于(int i=0;i>home[i]),第二;
home[i].first=i;//索引中的第一个,接下来是该玩家的ELO评分
}
对于(int i=0;i>visitors[i]),第二;
访客[i].first=i;
}
排序(home.begin()、home.end()、排序);
排序(visitors.begin()、visitors.end()、ordering);//两个团队都已排序

/*对于(int i=0;如果您将“return first.second>second.second;”更改为“return first.secondsecond.second;”更改为“return first.second#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; }