您的位置:首页 > 编程语言 > C语言/C++

PTA 1073 多选题常见计分法 (c++)

2019-08-17 17:21 1081 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_44622401/article/details/99695538



分析:这道题和1058有点类似。这类题属于那种很容易想出来应该怎么解,但是写的时候可能会有点绕。比较考验你的思路是不是很清晰。小建议:可以把一系列处理操作分块处理,封装成函数,最后调用就可以了。下面的代码来自这篇文章https://blog.csdn.net/qq_40946921/article/details/81166375

">#include<string>
#include<cmath>
using namespace std;
struct number {
double mark;
int nc;
int ny;
int ncount[101] = {0};        //用于记录每个选项错误次数
int pd[101] = { 0 };

}s[101];
double judge(int a[100], int b[100] ,int k) {    //a为正确选项,b为输入选项
int count = 0;    //正确计数器
int yn = 0;        //0为答对,1为答错
for (int i = 0; i < s[k].nc; i++) {
if (b[i] && a[i]) {            //如果输入为正确,正确计数器+1
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, k;
double sum;
char ch;
int t[101];        //用t记录输入的选项
cin >> n >> m;
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;
}
}
for (int i = 0; i < n; i++) {
sum = 0;
for (int j = 0; j < m; j++) {
cin >> ch >> k;
for (int i = 0; i < 101; i++) t[i] = 0;    //t置为空
for (int h = 0; h < k; h++) {
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: