摘自洛谷题库P5741
题目描述
现有 (N≤1000) 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 88 个字符的字符串,没有空格)、语文、数学、英语成绩(均为不超过 150150 的自然数)。如果某对学生的每一科成绩的分差都不大于5,且总分分差不大于10,那么这对学生就是“旗鼓相当的对手”。现在我们想知道这些同学中,哪些是“旗鼓相当的对手”?请输出他们的姓名。
所有人的姓名是按照字典序给出的,输出时也应该按照字典序输出所有对手组合。也就是说,这对组合的第一个名字的字典序应该小于第二个;如果两个组合中第一个名字不一样,则第一个名字字典序小的先输出;如果两个组合的第一个名字一样但第二个名字不同,则第二个名字字典序小的先输出。
输入格式
第一行输入一个正整数N,表示学生个数。
第二行开始,往下N行,对于每一行首先先输入一个字符串表示学生姓名,再输入三个自然数表示语文、数学、英语的成绩。均用空格相隔。
输出格式
输出若干行,每行两个以空格隔开的字符串,表示一组旗鼓相当的对手。注意题目描述中的输出格式。
分析一下,这道题可以用结构体解决,所以我们创建一个结构体,用来储存学生的信息。
#include
#include
#include
typedef struct
{
char name[10];
int ch, ma, en;
int total;
}stu;
好了,我们现在创建了一个名字为stu的结构体,储存每个学生的姓名、各门分数及总分。起初我创建了一个计数器在结构体里面,以便后面每次输出进行自增,这样再每次循环进行判断就可以防止一对对手重复出现。(我尝试问了文心一言他也是这么做的)但是实际上根本就不需要!因为接下来每次判断某个人是不是对手是从后一位开始判断,而不是从头遍历,所以无须担心一对重复出现的问题······
int main()
{
int n;
scanf("%d", &n);
stu stu_list[n];
for (int i = 0; i < n; i++)
{
scanf("%s", stu_list[i].name);
scanf("%d", &stu_list[i].ch);
scanf("%d", &stu_list[i].ma);
scanf("%d", &stu_list[i].en);
stu_list[i].total = stu_list[i].ch + stu_list[i].ma + stu_list[i].en;
}
创建学生的结构体数组,然后录入各项信息。
//利用冒泡算法对学生进行重新排序
for (int i = 0;i < n;i++)
{
for (int j = i + 1;j < n;j++)
{
if (strcmp(stu_list[i].name, stu_list[j].name) > 0)
{
stu temp = stu_list[i];
stu_list[i] = stu_list[j];
stu_list[j] = temp;
}
}
}
利用冒泡算法对人名先进行排序,然后必须注意的是,这里交换的是整个结构体,因为姓名属性相当于结构体的关键字,所有其他属性相当于依附于姓名,所以要直接交换整个结构体而不是单一交换姓名(当然我相信大家也不会犯那种低级错误(我是笨蛋),毕竟没有人想名字排序变化,但分数不跟着自己的吧!哈哈哈)。
顺便提一句,strcmp函数用来计算字符数组的差,也就是根据ASCII依次比较两个字符串的每一个字符。
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str2 小于 str1。
- 如果返回值 = 0,则表示 str1 等于 str2。
另外,我在这个程序的先前版本中使用了strcpy(a,b)函数,其作用就是将b字符复制到a字符串。但是后来功能优化,没用到这个函数。
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n;j++)
{
if (abs(stu_list[i].total - stu_list[j].total) <= 10\
&& abs(stu_list[i].ch - stu_list[j].ch) <= 5\
&& abs(stu_list[i].ma - stu_list[j].ma) <= 5\
&& abs(stu_list[i].en - stu_list[j].en) <= 5)
{
printf("%s ",stu_list[i].name);
printf("%s\n",stu_list[j].name);
}
}
}
}
进行条件判断,符合条件就直接输出。
值得注意的是这里使用abs()函数,也就是绝对值函数,可以简化条件判断式的长度,其从
结尾废话:
果然还是想做动画,用blender做三渲二,或者blender3D做三渲二背景,然后人物3D辅助做矢量2D(用曲线工具强上呗),2D流程也可以在blender里完成,不过也可以试试retas(绝对不好用,但是是一种执念吧,毕竟最喜欢的京阿尼在用)。
期待以后也许会更新点blender的内容吧。
果然还是想去北影!要考研北影!