专栏首页卡尼慕1073 多选题常见计分法 (20 分)

1073 多选题常见计分法 (20 分)

1073 多选题常见计分法 (20 分)

【我的代码】

// 1073 多选题常见计分法 (20 分)
#include <iostream>
#include <string.h>
using namespace std;
struct Timu{
    double mark;
    int nc;
    int ny;
    int ncount[5] = {0};        //用于记录每个选项错误次数
    int pd[5] = { 0 };
}s[101]; 
double judge(int a[5], int b[5], int k){
    int count = 0;
    int yn = 0; //0为答对,1为答错
    for(int i = 0; i < s[k].nc; i++){
        if(b[i] && a[i]){   //如果输入为正确,正确计数器++ 
            count++;
        }
        else if (a[i] && !b[i]) {      //没有输入的正确选项
            s[k].ncount[i]++;
        }
        else if (!a[i] && b[i]) {      //输入了一个错误的选项
            s[k].ncount[i]++;
            yn = 1;
        }
    }
    if(yn) return 0;
    else if(count != s[k].ny) return s[k].mark/2;
    else if(count == s[k].ny) return s[k].mark; 
}
int main(){
    int N, M;//学生人数和多选题个数
    cin>>N>>M;
    double sum;
    char ch;
    int t[5];        //用t记录输入的选项
    //遍历题目 
    for(int i = 0; i < M; i++){
        cin>>s[i].mark>>s[i].nc>>s[i].ny;
        for(int j = 0; j < s[i].ny;j++){
            cin>>ch;
            s[i].pd[ch - 'a'] = 1; 
        }   
    } 
    //遍历学生
    int k;
    for(int i = 0;i < N; i++){
        sum = 0;
        for(int j = 0; j < M; j++){
            cin>>ch>>k;
            memset(t, 0, sizeof(t)); //重置为0
            for(int z = 0; z < k; z++){
                cin>>ch;
                t[ch - 'a']++;
            }
            //判断得分与比对答案
            sum += judge(s[j].pd, t, j); 
            cin>>ch;
        }
        printf("%0.1lf\n", sum);
    } 
    int max = 0;
    for(int i = 0; i < M; i++){
        for(int j = 0;j < s[i].nc; j++){
            max = s[i].ncount[j] > max ? s[i].ncount[j] : max;
        }
    }
    if(max){
        for(int i = 0; i < M; i++){
            for(int j = 0; j < s[i].nc; j++){
                if(s[i].ncount[j] == max){
                    cout<<max<<" "<<i+1<<"-"<<(char) (j+'a')<<endl;
                }
            }
        }
    }
    else{
        cout<<"Too simple";
    }
    return 0;
} 

【总结】

这题目跟前面有一题很类似,同样需要建立题目的结构体。

本文分享自微信公众号 - 卡尼慕(gh_40138f7dc7d3),作者:卡尼幕

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 1087 有多少不同的值 (20 分)

    当自然数 n 依次取 1、2、3、……、N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然...

    可爱见见
  • 1072 开学寄语 (20 分)

    可爱见见
  • 1061 判断题 (15 分)

    可爱见见
  • 洛谷P1941 飞扬的小鸟(背包 dp)

    很显然的dp,设\(f[i][j]\)表示第\(i\)个位置,高度为\(j\)的最小步数

    attack
  • CSU1216: 异或最大值(01Trie树)

    多组数据。第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。

    attack
  • BZOJ3265: 志愿者招募加强版(线性规划)

    attack
  • codechef September Challenge 2018 Division 2 A-F

    最大的是:$2, 3, 4, 5, n / 2, 1, 2 + n / 2, 3 + n / 2, 4 + n  /2 ...$

    attack
  • 洛谷P2447 [SDOI2010]外星千足虫(异或方程组)

    找最优解可以考虑高斯消元的过程,因为异或的特殊性质,每次向下找的时候找到第一个1然后交换就行,这样显然是最优的

    attack
  • 西南民族大学程序竞赛

    No matter what activities you join,whether you want or not, you could gain unexp...

    AngelNH
  • BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 4813  Solv...

    Angel_Kitty

扫码关注云+社区

领取腾讯云代金券