A75177.自动批改
2025-09-23 12:17:02
发布于:广东
14阅读
0回复
0点赞
题目描述
阿北和同学们临时抱佛脚,突击完成了近几年的CSP真题卷和模拟卷。
但是改卷子实在太麻烦了,于是唐老师想制作一个自动批改的程序,只需要把选项输入之后,就能够得到结果。
输入格式
第一行输入一个正整数n,表示参与做题的同学数量。
第二行输入一个只包含大写字母的字符串,表示标准答案。
接下来 n 行,按照编号顺序从 1 号到 n 号,每行输入一个只包含大写字母的字符串,表示该同学的答案。
输入的答案按照描述中的题型按顺序进行输入,判断题答案 A B分别表示正确与错误。
首先来看我们要输出的结果是编号和成绩
但是输入时是没有编号的
So,我们要有一个可以同时输入编号和答案的类型,以便后续的排序
只有结构体方便实现
//我们先定义一个结构体
struct student {
int id;//储存编号
string ans1; // 存储答案
float defen; // 因为判断题是一题1.5分, 要用小数类型
};
student a[55]; // 数组用来保存多组数据
我们来简单的输入一下(so simple)
//代码框架外定义
string ans;
int n;
//代码框架内输入
cin>>n>>ans;
for(int i = 1 ; i <= n ; i ++) {
cin>>a[i].ans1;
a[i].id = i;
}
然后我们来对数据进行简单的处理
注:这是一种简单的循环嵌套,效率较低 适合初学者 有简单的方法也欢迎提出来 数据叫大时不建议使用
for(int i = 1 ; i <= n ; i ++) {
for(int j = 0 ; j <= 14 ; j ++) if(a[i].ans1[j] == ans[j]) a[i].defen += 2;
//通过不断的循环遍历对错
for(int z = 15 ; z <= 18 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 19 ; z <= 20 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int z = 21 ; z <= 24 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 25 ; z <= 26 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int z = 27 ; z <= 30 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 31 ; z <= 32 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int z = 33 ; z <= 36 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 37 ; z <= 38 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int j = 39 ; j <= 48; j ++) if(a[i].ans1[j] == ans[j]) a[i].defen += 2;
}
因为最多是50组数据,50道题
所以50*50是250,上限是10的8次方,绝对不会TLE
现在我们来进行最后的处理 -- 排序 即输出的格式
按照得分从高到低的顺序每行输出一位同学的编号与得分,用空格隔开。
同分的同学按照编号从小到大的顺序依次输出。
可以看到同分的同学按照编号从小到大的顺序依次输出
所以,我们要用sort函数里的cmp自己写一段判断程序
sort(a + 1 ,a+n+1,cmp);
bool cmp(student x , student y) { //记得用同结构体类型的,如student、date等
if(x.defen != y.defen) return x.defen > y.defen; // 不等于时 记得要判断不同分 同分执行下列语句
else return x.id < y.id; //同分的同学按照编号从小到大的顺序依次输出
}
最后cout输出即可
for(int i = 1 ; i <= n ; i ++) cout<<a[i].id<<" "<<a[i].defen<<"\n";
我们就完成了!!!

全代码如下
#include <bits/stdc++.h>
using namespace std;
string ans;
int n;
struct student {
int id;
string ans1;
float defen;
};
student a[55];
bool cmp(student x , student y) {
if(x.defen != y.defen) return x.defen > y.defen;
else return x.id < y.id;
}
int main() {
cin>>n>>ans;
for(int i = 1 ; i <= n ; i ++) {
cin>>a[i].ans1;
a[i].id = i;
}
for(int i = 1 ; i <= n ; i ++) {
for(int j = 0 ; j <= 14 ; j ++) if(a[i].ans1[j] == ans[j]) a[i].defen += 2;
for(int z = 15 ; z <= 18 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 19 ; z <= 20 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int z = 21 ; z <= 24 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 25 ; z <= 26 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int z = 27 ; z <= 30 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 31 ; z <= 32 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int z = 33 ; z <= 36 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 1.5;
for(int z = 37 ; z <= 38 ; z ++) if(a[i].ans1[z] == ans[z]) a[i].defen += 2;
for(int j = 39 ; j <= 48; j ++) if(a[i].ans1[j] == ans[j]) a[i].defen += 2;
}
sort(a + 1 ,a+n+1,cmp);
for(int i = 1 ; i <= n ; i ++) cout<<a[i].id<<" "<<a[i].defen<<"\n";
return 0;
}
全部评论 1
码风逆天
2025-09-29 来自 上海
0













有帮助,赞一个