PTA

1057 数01 by YuhangQ

题目分析

给定一串长度不超过 10^5 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0、多少 1。例如给定字符串 PAT (Basic),其字母序号之和为:16+1+20+2+1+19+9+3=71,而 71 的二进制是 1000111,即有 3 个 0、4 个 1。

输入格式:

输入在一行中给出长度不超过 10^5 以回车结束的字符串。

输出格式:

在一行中先后输出 0 的个数和 1 的个数,其间以空格分隔。

代码

#include <iostream>
#include <cctype>
using namespace std;

int main() {
    string s;
    getline(cin, s);
    
    int sum = 0;
    for(auto i=s.begin(); i!=s.end(); i++) {
        char c = *i;
        if(islower(c)) sum += c - 'a' + 1;
        else if(isupper(c)) sum += c - 'A' + 1;
    }
    
    int cnt[2] = {};
    while(sum) {
        cnt[sum&1]++;
        sum>>=1;
    }

    printf("%d %d\n", cnt[0], cnt[1]);
    
    return 0;
}

1058 选择题 by YuhangQ

题目分析

批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多。

输入格式:

输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100),分别是学生人数和多选题的个数。随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数)、选项个数(不少于 2 且不超过 5 的正整数)、正确选项个数(不超过选项个数的正整数)、所有正确选项。注意每题的选项从小写英文字母 a 开始顺次排列。各项间以 1 个空格分隔。最后 N 行,每行给出一个学生的答题情况,其每题答案格式为 (选中的选项个数 选项1 ……),按题目顺序给出。注意:题目保证学生的答题情况是合法的,即不存在选中的选项数超过实际选项数的情况。

输出格式:

按照输入的顺序给出每个学生的得分,每个分数占一行。注意判题时只有选择全部正确才能得到该题的分数。最后一行输出错得最多的题目的错误次数和编号(题目按照输入的顺序从 1 开始编号)。如果有并列,则按编号递增顺序输出。数字间用空格分隔,行首尾不得有多余空格。如果所有题目都没有人错,则在最后一行输出 Too simple。

代码

#include <iostream>

using namespace std;

int good[101][5];
int score[101];
int wrong[101];

char getNextChar() {
    char c;
    while((c = getchar()) == ' ' || c == '\n' || c == '(' || c == ')');
    return c;
}

int main(int argc, char *argv[]) {
    int n, m; scanf("%d%d", &n, &m);
    for(int i=1; i<=m; i++) {
        scanf("%d%d", &score[i], &score[0]);
        int k; scanf("%d ", &k);
        for(int j=1; j<=k; j++) {
            char c = getNextChar();
            good[i][c-'a'] = 1;
        }
    }
    
    
    for(int i=1; i<=n; i++) {
        int tot = 0;
        for(int j=1; j<=m; j++) {
            bool flag = 1;
            int num = getNextChar() - '0';
            int tmp[5] = {};
            for(int k=1; k<=num; k++) {
                char c = getNextChar();
                tmp[c-'a'] = 1;
            }
            
            //printf("M: %d - %d\n", j, flag);
            
            for(int k=0; k<5; k++) flag = min(flag, tmp[k]==good[j][k]);
            if(flag) tot += score[j];
            else wrong[j]++;
        }
        printf("%d\n", tot);
    }
    
    int max_wrong = 0;
    for(int i=1; i<=m; i++) {
        //printf("%d ", wrong[i]);
        max_wrong = max(max_wrong, wrong[i]);
    }
    //printf("\n");
    
    int q[101] = {};
    
    if(!max_wrong) {
        printf("Too simple\n");
    } else {
        printf("%d ", max_wrong);
        for(int i=1; i<=m; i++) {
            if(wrong[i] == max_wrong)
                q[++q[0]] = i;
        }
        for(int i=1; i<=q[0]; i++)
            printf("%d%s", q[i], i==q[0]?"":" ");
    }
    
}
Last modification:December 5th, 2019 at 02:21 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment