1462: [蓝桥杯2019初赛]组队(2020.2.14)

祝大家情人节快乐!!武汉加油!

1462: [蓝桥杯2019初赛]组队

题目描述

作为篮球队教练,你需要从以下名单中选出1 号位至5 号位各一名球员,组成球队的首发阵容。
每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?
在这里插入图片描述
该表格可以参考: team.txt.

解题思路

创建一个20*6的数组,利用两次循环分别找到每一列每一行最大元素保存在Max[5]数组中并求和

C语言FILE文件操作

链接: C语言详解 FILE文件操作.

打开文件

函数原型为:_CRTIMP FILE * __cdecl fopen(const char *, const char *);
第一参数为文件名,第二个参数为打开模式。

打开成功,fopen返回一个结构指针地址,否则返回一个NULL。如果没有指定文件路径,则默认为当前工作目录。如:
FILE *fp;
fp = fopen(“c:\temp\test.txt”, “r”) //由于反斜杠\是控制字符,所以必须再加一个反斜杠

使用fopen()函数打开的文件会先将文件复制到缓冲区。注意:所下达的读取或写入动作,都是针对缓冲区进行存取而不是磁盘,只有当使用fclose()函数关闭文件时,缓冲区中的数据才会写入磁盘。

“r”:只能从文件中读数据,该文件必须先存在,否则打开失败
“w”:只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
“a”:向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
“r+”:可读/写数据,该文件必须先存在,否则打开失败
“w+”:可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
“a+”:可读/写数据,原来的文件不被删去,位置指针移到文件末尾

打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母’b’,以表示以二进制形式打开文件。

格式化存取函数

函数原型为:
_CRTIMP int __cdecl fprintf(FILE *, const char *, …);
_CRTIMP int __cdecl fscanf(FILE *, const char *, …);

它们与printf和scanf函数相仿,都是格式化读写函数。不同的是:fprintf和fscanf函数的读写对象不是终端(标准输入输出),而是磁盘文件。printf函数是将内容输出到终端(屏幕),因此,fprintf就是将内容输出到磁盘文件了。
实例: fprintf和fscanf函数的使用

#include <stdio.h>
int main()
{
    FILE *fp;
    int num = 10;
    char name[10] = "Leeming";
    char gender = 'M';
    if((fp = fopen("info.txt", "w+")) == NULL)
        printf("can't open the file! \n");
    else
        fprintf(fp, "%d, %s, %c", num, name, gender); //将数据格式化输出到文件info.txt中
    fscanf(fp, "%d, %s, %c", &num, name, &gender); //从文件info.txt中格式化读取数据
    printf("%d, %s, %c \n", num, name, gender); //格式化输出到屏幕
    fclose(fp);
    return 0;
}

解题代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[20][6];
    int i,j,k,max,sum;
    int Max[5];
    
    FILE *fp;
    if((fp=fopen("team.txt","r"))==NULL)
    {
        printf("文件打开失败!\n");
        exit(0);
    }
    else
    {
        for(i=0;i<20;i++)
        {
            for(j=0;j<6;j++)
            {
                fscanf(fp,"%d",&a[i][j]);
            }
        }
    }
    for(i=0;i<20;i++)
    {
        max=0;
        for(j=1;j<6;j++)
        {
            if(a[i][j]>max)
            {
                max=a[i][j];
                k=j;
            }
        }
        for(j=1;j<6;j++)
        {
            if(j!=k)
                a[i][j]=0;
        }
    }
    
    for(j=1;j<6;j++)
    {
        max=0;
        for(i=0;i<20;i++)
        {
            if(a[i][j]>max)
                max=a[i][j];
        }
        Max[j-1]=max;
    }
    sum=0;
    for(i=0;i<5;i++)
    {
        sum+=Max[i];
    }
    printf("%d\n",sum);
    return 0;
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值