zoukankan      html  css  js  c++  java
  • 1058. 选择题(20)

    原题: https://www.patest.cn/contests/pat-b-practise/1058

    思路: 本题主要就是怎么读取数据的问题, 一定要注意scanf函数匹配到
    空格或者回车会结束当前变量的赋值, 并且会丢弃这个空格或回车.

    关于如何判断一项答题是否正确, 可以采用循环一个一个判断, 也可拼成
    字符串用strcmp来判断. 我一开始使用的是累加和来判断是否正确, 但是
    这种方法最后一个测试点通不过. 因为abcde的ASCII码分别是,
    97 98 99 100 101, 那么97+101 = 98+100. 后来我看了一位网友的方案
    采用累加或的方法, 完美解决了这种值不一样和确一样的问题.
    首先把abcde, 分别转成12345, 分别表示成1的2进制左移

    1 << 1 ==     10  
    1 << 2 ==    100
    1 << 3 ==   1000
    1 << 4 ==  10000
    1 << 5 == 100000
    

    加入一个选项是abcd为正确, abcd进行或运算则为1110, 这样就不会出现和
    重复的问题. 在后面比较的时候, 直接判断值是否相等即可得知是否正确.
    并且假如某个学生就是抽风, 正确答案是abc, 但是他的答案是bca, 像这种
    极端的答案如果用传统的方法判断, 搞不好还得先来遍排序, 但是用2进制的
    方法, 不存在这个问题.

    实现:

    #include <stdio.h>
    
    struct Ques {
        int fscore;  // 该题分数
        int calc;    // 正确计算分
        int wnum;    // 该题错误次数
    };
    typedef struct Ques ques;
    
    int main (void) {
        int snum;  // 学生人数
        int qnum;  // 题目数量
        ques qmsg[100]; // 每一题的信息
        int useless; // 没用的东西
        int rnum;    // 正确选项个数
        int i;
        int j;
        int k;
        char ch;
    
        scanf("%d %d", &snum, &qnum);
        for (i = 1; i <= qnum; i++) {
            qmsg[i].calc = 0;
            qmsg[i].wnum = 0;
            scanf("%d %d %d", &qmsg[i].fscore, &useless, &rnum);
            for (j = 1; j <= rnum; j++) {
                // 这里需要匹配空格
                scanf(" %c", &ch);
                // qmsg[i].calc += ch;
                qmsg[i].calc |= 1 << (ch - 'a' + 1);
            }
            // printf("qmsg[i].calc: %d
    ", qmsg[i].calc);
        }
    
        getchar();     // 去除回车
        int score;     // 学生得分
        int tcalc = 0; // 临时计算分
        int cnum;      // 选中选项个数
        char ch2;      // 临时用
        for (i = 1; i <= snum; i++) {
            score = 0;
            j = 1; // 题目编号
            // 每次遍历一整行, 为一个学生的答题信息
            // 检测到(, 即答到了下一题
            while ((ch = getchar()) != '
    ') {
                if (ch == '(') {
                    scanf("%d", &cnum);
                    for (k = 1; k <= cnum; k++) {
                        scanf(" %c", &ch2);
                        // tcalc += ch2;
                        tcalc |= 1 << (ch2 - 'a' + 1);
                    }
                    if (tcalc == qmsg[j].calc) {
                        score += qmsg[j].fscore;
                    } else {
                        qmsg[j].wnum += 1;
                    }
                    tcalc = 0;
                    j++;
                }
            }
            printf("%d
    ", score);
        }
    
        int wmax = qmsg[1].wnum;
        for (i = 1; i <= qnum; i++) {
            if (qmsg[i].wnum > wmax) {
                wmax = qmsg[i].wnum;
            }
        }
        if (wmax == 0) {
            printf("Too simple
    ");
        } else {
            printf("%d", wmax);
            for (i = 1; i <= qnum; i++) {
                if (qmsg[i].wnum == wmax) {
                    // 每个空格都很关键
                    printf(" %d", i, ch);
                }
            }
        }
    
        return 0;
    }
    
    

    参考: http://www.jianshu.com/p/4a8a570e41c3

  • 相关阅读:
    【Python教程】3道循环结构练习题
    python3中实现print不换行的方法
    零基础学Python:字典(Dictionary)详细教程
    TS错误提示
    v-slot的简单理解应用
    Typora使用方法简单整理
    Java基础系列(6)- 面向对象(中)
    monkey基础 (7)
    monkey基础 (6)
    monkey基础 (5)
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7873763.html
Copyright © 2011-2022 走看看