我是歌手-C语言

“我是歌手”是成名歌手之间的比赛节目,2轮比赛中观众支持率最低者出局。

这里我们假设有n个歌手进行了m轮比赛,请求出局者(m轮总分最低者)。

输入n个歌手(编号依次为1,2,......n)m轮比赛的成绩,输出出局者(m轮总分b最低者)的编号。若有多个歌手的总分都是最低,则出局者是编号最小者

输入格式:

输入数据的第一行为一个正整数T(1<=T<=20)表示测试数据的组数。然后是T组测试数据,每组测试数据先输入两个正整数n,m(n,m<=10),然后是m行输入,每行按次序输入n个歌手在该轮的得分(均为非负整数)。

输出格式:

对于每组测试,在一行上输出出局者的编号。

输入样例:

1
3 2
91 92 93
98 95 94

输出样例:

 

#include
#include
#define MAXN 1005
int t, n, m, a[MAXN];//a[MAXN]表示每个歌手在m轮比赛中的总得分
int main()
{
    scanf("%d", &t);
    while (t--)
//每次循环表示对于一组数据的处理
    {
        memset(a, 0, sizeof a);
//初始化a数组为0,以保证累加歌手得分时不产生干扰
        scanf("%d%d", &n, &m);
        for (int i = 0; i < m; i++)
        {
//第一重循环,枚举比赛的轮数
            for (int j = 0; j < n; j++)
            {
//第二重循环,枚举歌手的分数
                int x;
//定义x表示每个歌手的当前比赛得分
                scanf("%d", &x);
                a[j] += x;
//累加每个歌手的总分
            }
        }
        int k = 0;
//定义变量k表示出局者的编号,以0号歌手为初始值
        for (int i = 1; i < n; i++)
//循环找出出局者
        {
            if (a[i] < a[k])
                k = i;
        }
        printf("%d\n", k + 1);
    }
    return 0;
}

使用一个数组来存储每个歌手的总分,然后扫描这个数组,找到总分最低的歌手,并输出编号即可。

  1. 首先定义一个数组a,用于存储每个歌手的总分;
  2. 初始化数组a,使用memset函数,把数组a的每一个元素都设为0;

memset 函数是 C 语言中的内存函数,功能是用一个指定的字符填充一段内存区域,也就是将一段内存区域的内容全部设置为一个字符。

 void *memset(void *s, int c, size_t n);

参数:

  • s:指向要填充的内存区域的指针
  • c:填充的字符
  • n:填充的内存区域的大小(单位:字节)

返回值:指向 s 的指针,也就是填充后的内存区域的首地址。 

  1. 循环读入m轮比赛的成绩,对于每轮的成绩,循环读入n个歌手的成绩,并把读入的每个歌手的成绩加到对应的数组a的元素上;
  2. 定义一个变量k,初始化为0;
  3. 循环扫描数组a,从第一个元素开始,如果a[i]比a[k]更小,则把k设为i;
  4. 最后输出k + 1,因为数组a是从0开始存储的,而歌手的编号是从1开始的。

 如果不使用memset函数,可以通过循环将数组中的每一项赋值为0。

例如:

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

这样就能达到将数组中的每一项赋值为0的目的,与memset函数的作用相同。

你可能感兴趣的:(菜鸟学习之路,c++,开发语言)