厚积薄发 发表于 2010-5-6 18:55

2006 年百度之星程序设计大赛初赛题目 2

题目名称:蝈蝈式的记分

内容描述:

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

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

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

输入数据:

以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。

输出数据:

相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。

输入和输出结果数据样例:

输入样例

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


输出样例

21:17

24:22

21:3

Unknown

21:14

20:22

21:23

21:16

21:9


example:public class GouGouShiJiFen {

    public int[][] bs = new int;//当前可能的比赛结果
//    public int[][] bsOK = new int;//成功的一种可能比赛结果
//    public int[][] bsBak = new int;//当前可能的比赛结果备份
//    public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
    public int numOfAbleJu = 0;    //本行比赛可能的结果有几种
   
    /**
     * @param index 连续得失分的index
     * @param scene 第几局比赛
     * @param whichPlayer index处分为哪个选手得分
     * @param record GuoGuo记的一行分
     * @return 是否是一种可能的比赛结果
     */
    public boolean check(int index, int scene, int whichPlayer, int[] record) {
        int playerIndex = whichPlayer;
        boolean isWanZhengJu = false;
        for (int i = index; i < record.length; i++) {
            isWanZhengJu = false;
            playerIndex = (whichPlayer + i - index) % 2;
            bs += record;
            if (bs >= 19 && bs >= 19) {//延长球或21:19 必须差二分才算正常结束一局
                if (Math.abs(bs - bs) == 2) {//一局正常结束
                    scene++;
                    whichPlayer = scene % 2;
                    index = i + 1;
                    isWanZhengJu = true;
                    continue;
                } else if (Math.abs(bs - bs) > 2) {//两者相差大于2球,则错误的
                    return false;
                }
            } else if ((bs > 21 && bs <= 19) || (bs > 21 && bs <= 19)) {//一方超过21,一方<=19,是错误的
                return false;
            } else if (bs == 21 || bs == 21) {//一方为21,另一方<=19,一局正常结束
                scene++;
                whichPlayer = scene % 2;
                index = i + 1;
                isWanZhengJu = true;
                continue;
            }
            if (record == 10 && i != (record.length - 1)) { //下一个数分情况
                int[][] bsBak = new int;
                cpy2deepArr(bs, bsBak);
                if (check(i + 1, scene, playerIndex, record)) {
                    cpy2deepArr(bsBak, bs);
                    if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
                        return false;
                    }
                    return numOfAbleJu < 2;
                } else {
                    cpy2deepArr(bsBak, bs);
                    if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
                        return numOfAbleJu < 2;
                    }
                }
                return false;
            }
        }
        
        if (!isWanZhengJu) {
            return false;
        }
//        //检查是否符合五局三胜
//        int a = 0, b = 0;
//        for (int i = 0; i < bs.length; i++) {
//            if (bs == 0 && bs == 0) {//没有局待检查了
//                break;
//            }
//            if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
//                return false;
//            }
//            if (bs > bs) {
//                a++;
//            } else {
//                b++;
//            }
//        }
//        if (a < 3 && b < 3) {//没有一个人得三局,故错误
//            return false;
//        }
        //只要有三局及以上正常结果,则可视为OK
        int count = 0;
        for (int i = 0; i < bs.length; i++) {
            if (bs == 0 && bs == 0) {//没有局待检查了
                break;
            }
            count++;
        }
        if (count < 3) {
            return false;
        }
        
        numOfAbleJu += 1;
        return true;
    }
    private void cpy2deepArr(int[][] src, int[][] dest) {
        for (int i = 0; i < src.length; i++) {
            for (int j = 0; j < src.length; j++) {
                dest = src;
            }
        }
    }
   
    public void printNowCheck() {
        for (int i = 0; i < bs.length; i++) {
            if (bs == 0 && bs == 0) {//没有局待检查了
                break;
            }
            //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
            if (bs > bs) {
                System.out.println(bs + ":" + bs);
            } else {
                System.out.println(bs + ":" + bs);
            }
        }
    }
    public void resetCheck() {
        for (int i = 0; i < bs.length; i++) {
            bs = 0;
            bs = 0;
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        GouGouShiJiFen obj = new GouGouShiJiFen();
        int[][] testData = {
                {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
                {9, 3, 8, 5, 4, 8, 3, 9, 8, 4, 10, 10, 10, 10, 2, 10, 10, 10, 10, 2, 8, 4, 9, 2, 4},
                {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}
        };
        for (int i = 0; i < testData.length; i++) {
            if (obj.check(0, 0, 0, testData)) {
                obj.printNowCheck();
            } else {
                System.out.println("Unknown");
            }
            obj.resetCheck();
        }
    }

}

七一琛余 发表于 2011-12-23 00:18

大家顶啊,这么好的帖子,楼主辛苦了

pxwgih 发表于 2011-12-30 12:31

真不知道,还有这么好心的楼主 支持

程先生 发表于 2012-7-12 12:39

不错,不错!!!!!!!!!!!!!!!!!!!!!

sdccumcm 发表于 2012-8-24 01:15

编程很重要!很有必要的练习

piaopiao6872 发表于 2012-8-27 21:50

看起来还挺高深的样子么,呵呵~

函数名曰似然 发表于 2012-12-9 17:09

厉害啊,要学学

pgzt4uAw 发表于 2017-5-16 21:21

云药集团·云药七宝是“不招标的国家基药”欢迎咨询:13866239977 张总(云药中药超微破壁粉)
云药中药超微破壁粉已经启动全国市场,现在诚招少数空白区域的临床合作伙伴!
欢迎咨询云药集团! 13866239977 张总

云药集团·云药七宝 :灯盏花粉、石斛粉、三七粉、天麻粉、红景天粉、西洋参粉、丹参粉;
只有找对了产品,才能在拥挤的市场中找到属于自己的一片蓝海!

云药集团·云药七宝 政策解读 云药七宝是 “不招标的国家基药”欢迎咨询云药集团! 13866239977 张总

云药集团·云药中药超微破壁粉的核心技术:
v 超微技术:指先进的超微粉碎技术‘’
v 上世纪70年代初,传统粉碎技术基础上发展起来的高新技术。超微技术目前被广泛用于冶金、航天和生物制药等高科技行业;
v 超微中药:超微技术结合中药的炮制技术与制剂技术研制成的微米级新型中药饮片;
v 超微中药的粉体是微米级的粉体(1~75μm,大部分细胞破壁);

云药集团·超微中药相关基础知识:
v中药的细胞大小在100μm左右;
v中药的成分分布在细胞间和细胞内;            
v细胞壁非常坚硬,保护细胞内的物质;
v传统的水煎煮过程中只能将细胞间的成分提取出来,而细胞内的成分不易出来;               

云药集团·云药单方超微饮片的破壁技术:
破壁技术:采用超音速撞击粉碎系统粉碎而成。粒径为10μm(1200目以上)以下,达到破壁破膜粒度。加工中无污染(GMP标准)、保持物质的有效成分,粉碎精度高、粉体造型好;
云药中药超微粉采用先进技术、规范化生产,使之达到高效利用;

规范化生产:符合《药品生产质量管理规范》车间,满足10万级洁净区干燥净化空气密闭状态下生产;
破壁技术:采用超音速撞击粉碎系统粉碎而成。粒径为10μm(1200目以上)以下,达到破壁破膜粒度;加工中无污染、保持物质的有效成分,粉碎精度高、粉体造型好;
高效利用:有效成分溶出速率较常规药材提高3倍以上,提高药物的生物利用度,用量为常规剂量的1/3;
欢迎咨询云药集团! 13866239977 张总

gaogao12/19 发表于 2019-4-6 07:03

初,初几,,,,。,。,,。。。。。
页: [1]
查看完整版本: 2006 年百度之星程序设计大赛初赛题目 2