这道题我以运用string 为主 ,因为string 可以直接进行+=,和== 的操作。还是代码如下,再听我多说两句。
#include <bits/stdc++.h>
using namespace std;
struct node{
int con,num,rig;
string ans;
int times;
}a[110];
int main()
{
string q,w;
int n,m,j,ko,sum,i,t;
scanf("%d%d",&n,&m);
for(i=0;i<m;++i){
scanf("%d%d%d",&a[i].con,&a[i].num,&a[i].rig);
a[i].times=0;
for(j=0;j<a[i].rig;++j){
cin>>q;
w+=q;
}
a[i].ans=w;
w.clear();
}
for(i=0;i<n;++i){
sum=0;
for(j=0;j<m;++j){
cin>>q;
ko=q[1]-'0';
if(ko!=a[j].rig) {
a[j].times+=1;
for(t=0;t<ko;++t) cin>>q;
}
else {
for(t=0;t<ko;++t){
cin>>q;
w+=q;
}
w.erase(w.begin()+ko);
if(w==a[j].ans) sum+=a[j].con;
else a[j].times+=1;
w.clear();
}
}
printf("%d\n",sum);
}
int max=0;
for(i=0;i<m;++i){
if(a[i].times>max) max=a[i].times;
}
if(max==0) printf("Too simple");
else {
printf("%d",max);
for(i=0;i<m;++i){
if(a[i].times==max) printf(" %d",i+1);
}
}
printf("\n");
return 0;
}
解释之不读题了
主要矛盾
题目在输入数据时,每一题的正确答案好解决,比较棘手的是每个学生答题时的 括号 () 。看了别人的,发现有些神级人物们用
scanf("(%d",&n);
scanf(" %c",&sp);
来读入学生回答的个数和答案选项。之后来处理空格 和 换行
我就比较直接了,只要读入答案选项就直接用一个string来表示
for(j=0;j<a[i].rig;++j){
//首先读入正确答案 w是正确的答案
cin>>q;//q是每次读入的选项,因为string遇空格就停止 所以q就是一个单字符
w+=q;//将q依次放在w里
}
a[i].ans=w;
w.clear();//记住 每次重新读入时需要清空w 不然下一题的答案就可能是abb
}
下面是录入学生选项
for(j=0;j<m;++j){
cin>>q;//直接将(n 读进来 n是选择个数
ko=q[1]-'0';//ko是选择个数 将n赋给ko
if(ko!=a[j].rig) {
a[j].times+=1;//个数不对时,直接错误次数加一
for(t=0;t<ko;++t) cin>>q;//将回答读入 无需存储,反正是错的
}
else {
//个数正确时
for(t=0;t<ko;++t){
cin>>q;
w+=q;//和读入答案一样
}//注意 最后一个选项和)连在了一起
w.erase(w.begin()+ko);//这里需要删除最后的) 因为之前w是ab)
if(w==a[j].ans) sum+=a[j].con;//然后 直接比较
else a[j].times+=1;
w.clear();//清空 再来
}
}
由于用cin来读入string 所以时间肯定是比大神们要长不少,由于题目的数据较少,我在最后一个测试点也过了 。自己比了一下 时间几乎是大神们的两倍了。
本题好似没有次要矛盾。
wish you all the best.