回 帖 发 新 帖 刷新版面

主题:百度Astar2006程序设计大赛预赛题--蝈蝈计分

注册过的朋友请到http://star.baidu.com 答题 


4.蝈蝈计分 
蝈蝈小朋友刚刚学会了0~9这十个数字,也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“3 2 4”可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用0~9这十个数字,所以当比赛选手得分超过9的时候,他会用一个X来表示10完成记分。但问题是,当记录为“X 3 5”的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 

因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛过程的情况,也要输出相应的提示哦。 

需要进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获胜三局后就获得最终胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 

输入要求:
1.文件中第一行只有一个整数M,表示蝈蝈记录了多少场比赛的分数;
2.在接下来的2M行里,每场比赛用两行记录,第一行是一个整数N(N<=1000)表示当前这个记录中有多少个字符,第二行就是具体的N个字符表示记录的分数(相邻字符用空格隔开)。例:
3
23
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
25
9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
43
7 7 7 7 7 3 4 5 6 7 6 5 4 2 1 3 5 7 9 7 5 3 1 3 0 9 9 3 9 3 2 1 1 1 5 1 5 1 5 1 5 5 1



输出要求:
对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用":"分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测,以“UNKNOWN”一个单词独占一行表示(请全部使用大写字母)。例:
21:17
24:22
21:3

UNKNOWN

21:14
20:22
21:23
21:16
21:9



评分规则:
1.程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过10秒,否则该用例不得分;
2.要求程序能按照输入样例的格式读取数据文件,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
3.该题目共有4个测试数据集,每个测试数据集为一个输入文件。各测试数据集占该题目分数的比例分别为20%,30%,40%,10%;
4.该题目10分。

回复列表 (共15个回复)

11 楼

bool CScore::GetResult(Score curScore,bool bFlag,deque<int> restData,ALL_RESULT &result)
{
    bool tmpFlag = bFlag;

    int pushCount = 0;

    while(restData.size() != 0)
    {

        if(tmpFlag)
        {
            curScore.first += restData[0];

            if(CheckScore(curScore) == 1)
            {
                if(result.allResults.size() == 0
                    || result.allResults.back().Result == true)
                {
                    RESULT emptyResult;
                    emptyResult.Result = false;

                    result.allResults.push_back(emptyResult);                
                }

                result.allResults.back().resultVec.push_back(curScore);

                ++pushCount;

                curScore.first = 0;
                curScore.second = 0;

                tmpFlag = !tmpFlag;
                restData.pop_front();

                continue;
            }
            else if(CheckScore(curScore) == -1)
            {
                if(result.allResults.size() != 0
                    && result.allResults.back().Result == false)
                {
                    for(int i = 0;i < pushCount;i++)
                    {
                        result.allResults.back().resultVec.pop_back();
                    }
                }

                return false;
            }
        }
        else
        {
            curScore.second += restData[0];

            if(CheckScore(curScore) == 1)
            {
                if(result.allResults.size() == 0
                    || result.allResults.back().Result == true)
                {
                    RESULT emptyResult;
                    emptyResult.Result = false;

                    result.allResults.push_back(emptyResult);
                }

                result.allResults.back().resultVec.push_back(curScore);

                ++pushCount;

                curScore.first = 0;
                curScore.second = 0;

                tmpFlag = !tmpFlag;
                restData.pop_front();

                continue;
            }

12 楼

            else if(CheckScore(curScore) == -1)
            {
                if(result.allResults.size() != 0
                    && result.allResults.back().Result == false)
                {
                    for(int i = 0;i < pushCount;i++)
                    {
                        result.allResults.back().resultVec.pop_back();
                    }
                }

                return false;
            }
        }

        if(10 == restData[0])
        {
            restData.pop_front();

            bool Result1 = GetResult(curScore,true,restData,result);
            bool Result2 = GetResult(curScore,false,restData,result);

            return (Result1    || Result2);
        }

        restData.pop_front();
        tmpFlag = !tmpFlag;
    }

    if(0 == curScore.first
        && 0 == curScore.second
        && CheckResult(result.allResults.back()))
    {
        ++result.PossibleCase;
        return true;
    }
    else
    {
        for(int i = 0;i < pushCount;i++)
        {
            result.allResults.back().resultVec.pop_back();
        }
    }

    return false;
}

13 楼

int CScore::CheckScore(Score score)
{
    if(score.first < score.second)
    {
        int temp = score.first;
        score.first = score.second;
        score.second = temp;
    }

    if(score.first < 21)
        return 0;
    else if(score.first > 21)
    {
        if(score.second == score.first - 2)
            return 1;
        else if(score.second > score.first - 2)
            return 0;
        else
            return -1;
    }
    else
    {
        if(score.second < 20)
            return 1;
        else
            return 0;
    }
}

bool CScore::CheckResult(RESULT &result)
{
    vector<Score>::iterator iter = result.resultVec.begin();

    Score score;
    score.first = 0;
    score.second = 0;

    while(result.resultVec.end() != iter)
    {
        if((*iter).first > (*iter).second)
            ++score.first;
        else
            ++score.second;

        ++iter;

        if(score.first == 3    || score.second == 3)
            break;
    }

    if((score.first == 3 || score.second == 3)
        && result.resultVec.end() == iter)
    {
        result.Result = true;
        return true;
    }
    else
    {
        result.Result = false;
        return false;
    }
}

14 楼

//--------main.cpp-----------//

#include <iostream>
#include <fstream>
#include <string>
#include <deque>

#include "Score.h"

using namespace std;

void GetNextData(ifstream &fin,deque<int> &dataDeq)
{
    dataDeq.clear();

    int count;

    fin >>count;

    char temp;

    for(int i = 0;i < count;i++)
    {
        fin >>temp;

        if('X' == temp)
            dataDeq.push_back(10);
        else
            dataDeq.push_back(int(temp-48));
    }
}

int main(int argc[], char *argv[])
{
    ifstream fin;
    ofstream fout;

    deque<int> dataDeq;

    fin.open("in.txt");

    if(!fin)
    {
        cout <<"Failed";
        exit(1);
    }

    int times;

    fin >>times;

    RESULT result;

    fout.open("out.txt");

    for(int i = 0;i < times;i++)
    {
        GetNextData(fin,dataDeq);

        CScore matchScore;
        matchScore.GetData(dataDeq);

        if(matchScore.GetScore(result))
        {
            vector<Score>::iterator iter = result.resultVec.begin();

            while(result.resultVec.end() != iter)
            {
                fout <<(*iter).first
                    <<":"
                    <<(*iter).second
                    <<endl;

                ++iter;
            }

            fout <<endl;
        }
        else
        {
            fout <<"UNKNOWN"
                <<endl <<endl;
        }
    }

    fin.close();
    fout.close();

    return 0;
}

15 楼

贴出来才发现这么长....
还得分N帖发..郁闷啊...

希望哪位朋友那还有测试数据的,告知一下,谢谢~~

想知道自己的思维是否够缜密了..

我来回复

您尚未登录,请登录后再回复。点此登录或注册