“我是歌手”是成名歌手之间的比赛节目,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
输出样例:
2
#include<stdio.h>
#include<string.h>
#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;
}
使用一个数组来存储每个歌手的总分,然后扫描这个数组,找到总分最低的歌手,并输出编号即可。
- 首先定义一个数组a,用于存储每个歌手的总分;
- 初始化数组a,使用memset函数,把数组a的每一个元素都设为0;
memset
函数是 C 语言中的内存函数,功能是用一个指定的字符填充一段内存区域,也就是将一段内存区域的内容全部设置为一个字符。
void *memset(void *s, int c, size_t n);
参数:
s
:指向要填充的内存区域的指针c
:填充的字符n
:填充的内存区域的大小(单位:字节)
返回值:指向 s
的指针,也就是填充后的内存区域的首地址。
- 循环读入m轮比赛的成绩,对于每轮的成绩,循环读入n个歌手的成绩,并把读入的每个歌手的成绩加到对应的数组a的元素上;
- 定义一个变量k,初始化为0;
- 循环扫描数组a,从第一个元素开始,如果a[i]比a[k]更小,则把k设为i;
- 最后输出k + 1,因为数组a是从0开始存储的,而歌手的编号是从1开始的。
如果不使用memset函数,可以通过循环将数组中的每一项赋值为0。
例如:
for (int i = 0; i < n; i++) { a[i] = 0; }
这样就能达到将数组中的每一项赋值为0的目的,与memset函数的作用相同。