题目来源:
【入门4】数组 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P5728 【深基5.例5】旗鼓相当的对手 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
Question:
现有 $N$ 名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过 $150$ 的自然数)。如果某对学生〈𝑖,𝑗〉的每一科成绩的分差都不大于 5,且总分分差不大于 10,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。
Example:
输入 3 90 90 90 85 95 90 80 100 91 输出 2
Way:
使用二维数组
1.先开辟一个足够大的空间,接收n个人的成绩
2.把每名学生的总成绩存到一个一维数组里
3.判断两名同学是否符合条件:
这里我们可能一开始只能想到用一层for循环,然后让i 与 i+1相减作比较,但是这只能比较两个相邻的学生的成绩;所以我们要使用两层循环,相当于小学学的数有多少个组合方式的题,画图理解一下
4.别忘记用abs()绝对值函数
#include<stdio.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
int score[1001][3]={0};
int i,j,cn=0;
//录入学生信息
for(i=0;i<n;i++){
scanf("%d%d%d",&score[i][0],&score[i][1],&score[i][2]);
}
int sum[1001]={0};
for(i=0;i<n;i++){
for(j=0;j<3;j++){
sum[i]+=score[i][j];
}
}
//如何排序
//让第一个跟他后面的所有比
//让第二个和他后面的所有比
//所以我们使用双层for循环
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){//和后面的人比
int a=abs(score[i][1]-score[j][1]);
int b=abs(score[i][2]-score[j][2]);
int c=abs(score[i][0]-score[j][0]);//第一颗成绩
int x=abs(sum[i]-sum[j]);
if(a<=5&&b<=5&&c<=5&&x<=10)
cn++;
}
}
printf("%d",cn);
return 0;
}