我正在尝试找到最佳解决方案,以非常特定的顺序展示足球联赛的获胜者。
问题如下:
您输入参加比赛的队伍数。然后,您以矩阵形式输入所有球队的得分(mi,j =(x,y)表示球队i进球x进球,球队j得分y)。
所需的输出将是具有以下信息的团队排名列表:团队编号,团队积分,完成的团队目标,收到的团队目标。首先将为该团队分配更多的积分,如果两个团队拥有相同的积分,则第一个将是具有最佳进球差(完成-获得)的团队,如果相同,则顺序将是该团队的数量。如果您赢了,您将获得3分,如果您被平手,您将获得1分。
Sample input
4
0 0 1 0 2 1 0 2
2 2 0 0 3 3 1 3
1 1 1 2 0 0 3 2
1 0 0 1 2 3 0 0
Sample output
4 9 10 8
3 8 12 12
1 8 6 7
2 8 9 10
这是一个比我以前要解决的问题更复杂的问题(很棒)。
我遇到的问题是我无法决定如何处理订购系统。我认为最好的方法是将要点,完成的目标和收到的目标保存在另一个矩阵中,但是我不知道如何排序。为了分析分数,我想我会使用不同的功能进行绘制/赢/输工作流程,以了解我必须保存的点,首先垂直穿过矩阵(跳过主要对角线),然后水平穿过。我应该如何处理订购系统以显示排名表?另一个矩阵是存储积分,目标的最佳解决方案吗?
这是我目前设法完成的简单代码:
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
bool draw(const vector< vector<pair<int,int>> > &scores, int x, int y) { // Is it a draw?
if (scores[x][y].first == scores[x][y].second) return true;
return false;
}
bool x_win(const vector< vector<pair<int,int>> > &scores, int x, int y) { // Is it a win for team x?
if (scores[x][y].first > scores[x][y].second) return true;
return false;
}
void input_pairs_in_matrix(vector< vector<pair<int,int>> > &scores, int n) { // input pairs
int n1,n2;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin>>n1>>n2;
pair<int,int> p = make_pair(n1,n2);
scores[i][j] = p;
}
}
}
int main (){
int n; cin >> n; // number of teams
vector< vector<pair<int,int>> > scores(n,vector<pair<int,int>>(n)); //matrix of pairs
input_pairs_in_matrix(scores,n);
}
PD:我不是在寻找整体解决方案,因为这是家庭作业,但是我很迷茫,不胜感激一些技巧/建议。
最佳答案
在C++中进行编码时,应尝试使用class
。它们确实有助于将您的问题分解成小块,以便于理解,测试和使用。
对于您的问题,我将创建一个类(class)团队:
class Team
{
public:
unsigned int points;
unsigned int goals_marked;
unsigned int goals_received;
}
我将所有内容公开为一个最小的答案,您可能想要一个更完整的类,也许使用
operator>>
对其进行解码,等等...然后,您可以在此类型上创建operator<
,这将有助于您进行排序:bool operator<(Team &lh, Team &rh)
{
// return true if lh is less good than rh
}
然后排序只是在 vector 上调用sort的问题:
std::vector<Team> teams;
// Read your class and fill teams
std::sort(teams.begin(), teams.end());