主题:百度Astar2006程序设计大赛预赛题--蝈蝈计分
zwj1207
[专家分:40] 发布于 2006-05-27 10:38:00
注册过的朋友请到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 楼
xjy1204 [专家分:2250] 发布于 2006-06-14 15:23:00
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 楼
xjy1204 [专家分:2250] 发布于 2006-06-14 15:25:00
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 楼
xjy1204 [专家分:2250] 发布于 2006-06-14 15:26:00
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 楼
xjy1204 [专家分:2250] 发布于 2006-06-14 15:26:00
//--------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 楼
xjy1204 [专家分:2250] 发布于 2006-06-14 15:30:00
贴出来才发现这么长....
还得分N帖发..郁闷啊...
希望哪位朋友那还有测试数据的,告知一下,谢谢~~
想知道自己的思维是否够缜密了..
我来回复