洛谷日志(3)

摘自洛谷题库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的内容吧。

果然还是想去北影!要考研北影!

你可能感兴趣的:(洛谷日志,算法,c语言)