P11445 「ALFR Round 3」A 调皮的学生 题解

· · 题解

知识点分析

本题涉及三个知识点。

  1. if 语句

  2. for 循环

  3. 桶数组

题目分析

输入分析

我们先看输入,发现三种老师的输入结构都是一样的,所以可以得到输入代码(其中,abc 表示题目中的 a,b,cxyz 表示题目中的 x,y,zn 代表学生人数)。

int abc,n;
cin>>n;
for(int i=1;i<=3;i++)
{
    cin>>abc;
    int xyz[abc+1];//开小会RE 
    for(int j=1;j<=abc;j++)
    {
        cin>>xyz[j];
    }
}
//存储语句 

但是还有一种方法,叫边输入边判断,这样子就能让代码更简洁(其中,abc 表示题目中的 a,b,cxyz 表示题目中的 x,y,zn 表示小朋友的人数)。

int abc,xyz,n;
cin>>n;
for(int i=1;i<=3;i++)
{
    cin>>abc;
    for(int j=1;j<=abc;j++)
    {
        cin>>xyz;
        //存储语句 
    }
}

数据格式化

然后看到如何存储小朋友的投票次数,这里涉及到一个叫做桶数组的语法,也就是只存储状态的数组。

桶数组是要在 main 函数外定义的,如果非要在 main 函数内定义的话,就得要使用数组格式化工具(n 表示数组元素个数)。

int a[n+1];//开小会RE 
for(int i=0;i<=n;i++)
{
    a[n]=0;
} 

这样子,我们就定义好了桶数组,接下来,就要开始存储数据了。

我们一般将桶数组的元素编号称为学号,把桶数组的数值称为投票次数,这样,就能得到以下代码(xyz 表示题目中的 x,y,za 表示桶数组)。

a[xyz]++;//学号为xyz的学生投票次数加一

数据判断

最后,扫描整个桶数组,但是我们得要加一个条件。

这个条件得在题目中找。

但有些学生常常会为多位老师评分,或者不为任何老师评分。

这就是判断调皮的学生的条件,也就是投票次数 \ne1

那么,我们可以得到以下代码(其中,n 表示小朋友的学号,tp 表示淘气学生的人数)。

if(n!=1)
{
    tp++;
}

再加上一个 for 循环(其中,n 表示小朋友的学号,tp 表示淘气学生的人数,a_{n} 表示桶数组)。

for(int i=0;i<=n;i++)
{
    if(a[i]!=1)
    {
        tp++;
    }
} 

代码

我们的代码就完成了,接下来把代码组合一下,就能完成了。

#include<bits/stdc++.h>//万能头好习惯 
using namespace std;
int a[500];//开大一点,不然会RE
int main()
{
    int abc,xyz,tp=0,n;//tp一定要等于0,不然会输出随机数 
    cin>>n;//别忘了这一句,不然会编译错误 
    for(int i=1;i<=3;i++)
    {
        cin>>abc;//输入a,b,c结构都是一样的,所以可以用一份代码 
        for(int j=1;j<=abc;j++)//不能用i,不然会改变原变量,导致WA 
        {
            cin>>xyz;//输入每个学生学号 
            a[xyz]++;
        }
    }
    for(int i=1;i<=n;i++)//扫描整个桶 
    {
        if(a[i]!=1)
        {
            tp++;
        }
    }
    cout<<tp;//输出结果 
    return 0;
}

AC 记录。