这种题本身不难,但是题干超级无敌长,容易使人头晕眼花 ......
代码:
#include<bits/stdc++.h>
using namespace std;
struct quesion {
// 题号,本题的满分值,选项个数,正确选项个数,学生的错误次数
int no,sc,optnum,rightnum=0,wrong_cnt=0;
set<char> opt; // *:review一下set的特性
} que[1001];
int cmp(quesion a, quesion b) {
if(a.wrong_cnt!=b.wrong_cnt)
return a.wrong_cnt>b.wrong_cnt;
else return a.no<b.no;
}
int main() {
int n,m,cnt=0;
cin>>n>>m; // 学生人数,多选题个数
for(int i=0; i<m; i++) {
cin>>que[i].sc>>que[i].optnum>>que[i].rightnum;
que[i].no=i;
for(int j=0; j<que[i].rightnum; j++) {
char a;
cin>>a;
que[i].opt.insert(a);
}
}
for(int i=0; i<n; i++) {
int score=0,l; // 每个学生的成绩
char a;
scanf("\n");
for(int j=0; j<m; j++) {
cnt=0;
if(j>0) scanf(" ");
scanf("(%d",&l);
for(int k=0; k<l; k++) {
scanf(" %c",&a);
if(que[j].opt.find(a)!=que[j].opt.end()) cnt++; // 在本题正确答案的选项中能找着
}
scanf(")");
if(cnt==que[j].rightnum&&l==que[j].rightnum) { // *注意这个条件,此题回答正确
score+=que[j].sc;
} else { //此题回答错误
que[j].wrong_cnt++;
}
}
cout<<score<<endl; //输出每名同学的成绩
}
sort(que,que+m,cmp); // *:review一下结构体数组、vector等咋sort()
cnt=que[0].wrong_cnt;
if(cnt==0){ // 没有错误
cout<<"Too simple";
return 0;
}
cout<<cnt;
for(int i=0; i<m; i++) {
if(cnt==que[i].wrong_cnt) cout<<" "<<que[i].no+1;
else break;
}
return 0;
}
总结:
1、set 是集合,⼀个 set 中的各元素各不相同,而且 set 会按照元素从小到大排序,用法:
set<int> s; // 定义⼀个空集合s s.insert(1); // 向集合s⾥⾯插⼊⼀个1 cout << *(s.begin()) << endl; // 输出集合s的第⼀个元素 (前⾯的星号表示要对指针取值)
/* 查找集合s中的值, 如果结果等于s.end()表示未找到 (因为s.end()表示s的最后⼀个元素的下⼀个元素所在的位置) */ if(s.find('a')!=s.end()) cout<<"能找到";
2、注意以下 scanf() 的用法:
scanf("("%d", &a); scanf(")");
3、结构体数组、vector咋sort?
struct stu { int number; //学号 int score; //分数 } bool cmp(stu a, stu b) { // cmp函数,返回值是bool,传⼊的参数类型应该是结构体stu类型 if (a.score != b.score) // 如果学⽣分数不同,就按照分数从⼤到⼩排列 return a.score > b.score; else // 如果学⽣分数相同,就按照学号从⼩到⼤排列 return a.number < b.number; } sort(v.begin(), v.end(), cmp); sort(array, array + 10, cmp);
提交记录:
做这样的题一定要仔细,头脑要清楚。