本次训练共8题,本文附AC代码和题目链接。

本次训练均为基础题,会用二维数组和结构体就行了,很简单。

nefu 951 二维矩阵最大值

#include <stdio.h>
int main()
{
    int i,j,m,n,maxi,maxj,max,a[101][101];
    while(scanf("%d%d",&m,&n)!=-1)
    {
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
        }
        max=a[1][1];
        maxi=maxj=1;
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(a[i][j]>max)
                {
                    max=a[i][j];
                    maxi=i;
                    maxj=j;
                }
            }
        }
        printf("%d %d %d\n",maxi,maxj,max);
    }
    return 0;
}

nefu 953 矩阵相加

#include <stdio.h>
int main()
{
    int a[101][101],b[101][101],i,j,m,n,s[101][101];
    while(scanf("%d%d",&m,&n)!=-1)
    {
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
        }
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            scanf("%d",&b[i][j]);
        }
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            {
                s[i][j]=a[i][j]+b[i][j];
                if(j==n)printf("%d\n",s[i][j]);
                else printf("%d ",s[i][j]);
            }
        }
    }
    return 0;
}

nefu 952 二维矩阵对角线和

#include <stdio.h>
int main()
{
    int a[101][101],i,j,m,s;
    while(scanf("%d",&m)!=-1)
    {
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        }
        s=0;
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=m;j++)
            {
                if(i==j)
                    s=s+a[i][j];
                if(i+j==m+1)
                    s=s+a[i][j];
            }
        }
        printf("%d\n",s);
    }
    return 0;
}

nefu 954 矩阵相乘

这题要想清楚矩阵是怎么相乘的以及如何处理下标。

#include <stdio.h>
int main()
{
    int m,i,j,k,a[20][20],b[20][20];
    while(scanf("%d",&m)!=-1)
    {
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        }
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=m;j++)
                scanf("%d",&b[i][j]);
        }
        int s[20][20]={0};
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=m;j++)
            {
                for(k=1;k<=m;k++)
                s[i][j]=s[i][j]+a[i][k]*b[k][j];
            }
        }
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=m;j++)
            {
                if(j==m)printf("%d\n",s[i][j]);
                else printf("%d ",s[i][j]);
            }
        }
    }
    return 0;
}

nefu 955 五人帮

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m,n,i,j,k,s,ans,a[20][20];
    while(cin>>m>>n)
    {
        memset(a,0,sizeof(a));
        for(i=0;i<=m+1;i++)
        {
            for(j=0;j<=n+1;j++)
            {
                    if(i>=1&&i<=m&&j>=1&&j<=n)
                    cin>>a[i][j];//相当于在原二维矩阵外面再加一层0
            }
        }
        ans=0;
        for(i=0;i<=m+1;i++)
        {
            for(j=0;j<=n+1;j++)
            {
                if(i>=1&&i<=m&&j>=1&&j<=n)
                {
                    s=a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1];
                    if(s>ans) ans=s;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

nefu 1053 cc-test9-01结构体应用

#include <bits/stdc++.h>
using namespace std;
struct student
{
    char num[10],name[30];
    double score;
};
int main()
{
    int n,i;
    while(scanf("%d",&n)!=-1)
    {
        student stu[100];
        getchar();
        for(i=1;i<=n;i++)
        scanf("%s %[^\n] %lf",stu[i].num,stu[i].name,&stu[i].score);
        for(i=1;i<=n;i++)
        printf("%s  %s  %.2lf\n",stu[i].num,stu[i].name,stu[i].score);
    }
    return 0;
}

有一种很好的不跳过空格输入字符串的写法:

char s[100];
scanf(" %[^\n]",s);

这就比用gets(s)不跳过空格输入字符串好用多了。

nefu 1637 身高问题

sort函数中自定义cmp函数:先按身高降序排列,若身高相同则按学号升序排列,排序后数组中的第一个元素就是身高最大且学号最小的。

#include <bits/stdc++.h>
using namespace std;
struct node
{
    string name,h,num;
}p[101];
bool cmp(node a,node b)
//先按身高降序排列,若身高相同则按学号升序排列,排序后数组中的第一个元素就是身高最大且学号最小
{
    if(a.h!=b.h)return a.h>b.h;
    else return a.num<b.num;
}
int main()
{
    int n,i;
    cin>>n;
    for(i=0;i<n;i++)
    cin>>p[i].name>>p[i].h>>p[i].num;
    sort(p,p+n,cmp);
    printf("%s %s %s\n",p[0].name.c_str(),p[0].h.c_str(),p[0].num.c_str());
    return 0;
}

nefu 1638 成绩统计

其实这题不用结构体就能做。

#include <bits/stdc++.h>
using namespace std;
string flag,level;
int n,i,cnt,sum,mark;
int main()
{
    cin>>n;
    cnt=sum=0;
    for(i=1;i<=n;i++)
    {
        cin>>flag;
        if(flag=="C")
        {cin>>level;cnt++;}
        else
        {cin>>mark;sum=sum+mark;}
    }
    printf("%d %d\n",cnt,sum/(n-cnt));
    return 0;
}

寒假培训第一天就是这么些题了,把每道题AC还是挺有成就感的。

那么第一篇博客就到这里了。