PTA—1058 选择题
**
题目直达链接点我
**
关于这道题,就是字符处理起来有点麻烦,然后思路就按照题目所给的意思来就行了…
下面讲下这道题字符怎么读
就两点(都是输入的)
- 第一个就是输入答案那块,我们肯定是不能一次性都把那几个选项全部读完的,所以用一个字符变量读(不是字符串),然后它会读入空格(这是件很恼火的事)…,然后我们就需要判断是不是空格(废话),如果是就continue,这里如果使用for循环的话,增量在for表达式中,continue以后,增量是会增加的,所以不能把增量写在for里面…就是这样咯
- 第二个就是输入学生答案那块…那个括号伤脑筋…每次输入一道题答案括号后面有一个空格或者是回车,所以需要一个getchar()清理…
这题大概也就这些…
上代码
AC代码
#include <stdio.h>
struct pro
{
int alls; //满分
int sel; //选项数
int corsel; //正确选项数
char xx[6]; //选项
};
int main()
{
int n,m;
scanf("%d %d",&n,&m);
struct pro a[105];
int i,j;
for(i=0;i<m;i++)
{
scanf("%d %d %d",&a[i].alls,&a[i].sel,&a[i].corsel);
for(j=0;j<a[i].corsel;)
{
char c = getchar();
if(c != ' ')
a[i].xx[j++] = c;
}
a[i].xx[j] = '\0';
}
int cuoti[105] = {0}; //错题统计
int stu[1005] = {0}; //学生成绩
int max1 = 0; //错题最多的编号
getchar();
for(i=0;i<n;i++)
{
char c;
int x,flag = 0,k;
for(k=0;k<m;k++) //题目
{
flag = 0;
scanf("(%d ",&x);
for(j=0;j<x;) //输入选项
{
c = getchar();
if(c == ' ')
continue;
if(x != a[k].corsel) //输入错误的个数
flag = 1;
else //相同个数
if(a[k].xx[j] != c) //不同选项
flag = 1;
j++;
}
scanf(")");
c = getchar();
if(flag)
{
cuoti[k]++;
if(cuoti[k] > cuoti[max1])
max1 = k;
}
else
stu[i] += a[k].alls;
}
}
for(i=0;i<n;i++)
printf("%d\n",stu[i]);
if(cuoti[max1] == 0)
printf("Too simple");
else
{
printf("%d",cuoti[max1]);
for(i=0;i<m;i++)
if(cuoti[max1] == cuoti[i])
printf(" %d",i+1);
}
return 0;
}
------------------------------------------------------------------------------------end