我试图想出一个以非常具体的顺序展示足球联赛冠军的最佳解决方案。 问题如下:
您输入的球队数量。然后你以矩阵形式输入所有球队的得分(mi,j =(x,y)意味着球队我得到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:我不是在寻找整个解决方案,因为这是家庭作业,但我很遗憾,并希望得到一些提示/建议。
答案 0 :(得分:1)
在C ++中编码时,您应该尝试使用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
}
然后排序只是在向量上调用sort:
std::vector<Team> teams;
// Read your class and fill teams
std::sort(teams.begin(), teams.end());