C ++音乐教席

时间:2017-09-22 06:27:15

标签: c++

我一直试图在C ++中尝试编程问题。这是一个问题(查看第13页和第14页):https://www.cs.auckland.ac.nz/~mjd/prog_contest/problems/NZPC2017.pdf

到目前为止,这是我的代码:

#include <iostream>
#include <string>

using namespace std;

//Defining player
class Player
{
public:
    string name;
    int chair;
};

Player players[15];

//Eliminates a player
void eliminateP(int numPlayers, int rounds[])
{
    int e = 0;
    for (int i = 0; i < numPlayers; i++)
    {
        if (players[i].chair == rounds[0])
        {
            e = i;
            break;
        }
    }

    cout << players[e].name << " has been eliminated." << endl;

    for (; e < numPlayers-1; e++)
    {
        players[e] = players[e + 1];
    }
}

//Proceed a round
void doRound(int numPlayers, int rounds[])
{
    for (int i = 0; i < numPlayers; i++)
    {
        players[i].chair += rounds[1];
        while (players[i].chair > numPlayers)
        {
            players[i].chair -= numPlayers;
            if (players[i].chair <= 0)
            {
                players[i].chair += numPlayers;
            }
        }
    }

    eliminateP(numPlayers, rounds);
}

//Main function
int main()
{
    int numPlayers;
    cin >> numPlayers;
    for (int i = 0; i < numPlayers; i++)
    {
        cin >> players[i].name;
        players[i].chair = i + 1;
    }

    int numRounds;
    cin >> numRounds;

    int rounds[15][2];
    for (int i = 0; i < numRounds; i++)
    {
        cin >> rounds[i][0] >> rounds[i][1];
    }

    for (int i = 0; i < numRounds; i++)
    {
        doRound(numPlayers, rounds[i]);
        numPlayers--;
    }

    return 0;
}

奇怪的是,此代码适用于样本输入/输出2,但适用于样本输入/输出1.

有人可以给我提示并告诉我代码有什么问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

不再检查任何内容,输出可能包含:

void eliminateP(int numPlayers, int rounds[])
{
    for (int di = 0; di < numPlayers; ++di) {
        cout << players[di].name[0] << " " << players[di].chair << " | ";
    }
    cout << endl;

您的代码只能生成第一条消息,因此对于任何输入肯定都会失败,甚至输入2都无法正常工作,因为播放器列表必须丢失。

...但这可能不是你要问的。所以我确实添加了调试输出来消除这样的播放器:

A 2 | B 3 | C 4 | D 5 | E 1 | 
Bill has been eliminated.
A 2 | C 4 | D 1 | E 1 | 
Anne has been eliminated.
C 3 | D 3 | E 3 | 
Chen has been eliminated.
D 1 | E 1 | 
Di has been eliminated.

并使用示例输入1运行......并且发生了这种情况:

doRound

请注意,在第二次消除之前,如何对椅子进行错误编号(2,4,1,1而不是2,3,4,1)。当您移除播放器而不是椅子时(for中的奇怪逻辑会稍微修补主席号码以回到所需范围,但方式不正确。)

一个简单的修复可能是在第一个 if (rounds[0] < players[i].chair) --players[i].chair; 循环结束时扩展消除:

for

并且结束第二个break(在第一个循环中 if (rounds[0] < players[e].chair) --players[e].chair; 之后继续执行数组的剩余部分):

players

...那就是说,我对样式和效率以及整体算法也会有很多评论,所以在写整本书之前我会停在这里。

但是如果你要学习如何使用调试器,你很可能会在第一轮之后通过检查var genre = stations.map(item => item.genre); const stationsByGenre = genre.map(item => { if (genreArray.indexOf(item) === -1) { genreArray.push(item); //Genre Title - item stations.filter(station => { return station.genre === item }).map(station => { //Station row }); } }); 数组找出一些东西不完全正确,让椅子还在包括数字4和5,即使只有4个存在。 (我的这个调试输出是穷人的选择,当我只是把你的代码提供给在线网站,没有调试器......有时,就像在这种情况下,它可能就足够了,如果bug很明显,但一般你应该有调试器可以节省每个人的时间,因此您可以在代码运行时检查内部的任何内容)