寒假快乐刷题第二天 2021-01-19

7:20~7:25 打卡学习

8:00~9:00 背记单词

在这里插入图片描述

10:00~12:00 看算法书“啊哈算法”

第一章 一大波数正在靠近——排序
第二章 栈、队列、链表

15:30~18:30 平台刷题

问题 A: 快速幂取余,你真的会了吗?
看明白题目后就是个水题,就不说了

问题 D: 刷题的兄弟俩
经典的博弈问题,若先取完的为赢家,则当总数为每个人可以取的最大数加一的倍数时,后手赢,否则则先手赢,代码如下:

#include<stdio.h>

void main()
{
    
    
    int T;
    scanf("%d",&T);
    while(T--)
    {
    
    
        int n,m;
        scanf("%d%d",&n,&m);
        if(n%(m+1)==0) printf("gbl\n");
        else printf("lbg\n");
    }
}

问题 E: 打牌的兄弟俩
是上一道题的小小拓展,原理大致相同,没啥好讲的
问题 C: 签到送气球
这道题没用到啥有难度的算法,不过我发现了有个点需要细心
这是我之前错误的代码

#include<stdio.h>
#include<string.h>

struct A
{
    
    
    int a;
    char id,status[5];
};
typedef struct A TEAM;

int fun(char x)
{
    
    
    int z;
    z=x-'A'+1;
    return z;
}

void main()
{
    
    
    int T,i=0;
    scanf("%d",&T);
    while(T--)
    {
    
    
        int n,m,a[60][60]={
    
    0},b[60]={
    
    0};
        TEAM team[1010];
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
    
    
            getchar();
            scanf("%d%c%s",&team[i].a,&team[i].id,team[i].status);
            if(strcmp(team[i].status,"AC")==0) a[team[i].a][fun(team[i].id)]=1;
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=13;j++)
            if(a[i][j]==1) b[i]++;
        printf("Case #%d:\n",++i);
        for(int i=1;i<n;i++)
            printf("%d ",b[i]);
        printf("%d\n",b[n]);
    }
}

在输入那里出了问题,后来找出问题所在后的修改版:

#include<stdio.h>
#include<string.h>

struct A
{
    
    
    int a;
    char id,status[5];
};
typedef struct A TEAM;

int fun(char x)
{
    
    
    int z;
    z=x-'A'+1;
    return z;
}

void main()
{
    
    
    int T,i=0;
    scanf("%d",&T);
    while(T--)
    {
    
    
        int n,m,a[60][20]={
    
    0},b[60]={
    
    0};
        TEAM team[1010];
        scanf("%d%d",&n,&m),getchar();
        for(int i=1;i<=m;i++)
        {
    
    
            scanf("%d %c %s",&team[i].a,&team[i].id,team[i].status),getchar();
            if(strcmp(team[i].status,"AC")==0) a[team[i].a][fun(team[i].id)]=1;
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=13;j++)
            if(a[i][j]==1) b[i]++;
        printf("Case #%d:\n",++i);
        for(int i=1;i<n;i++)
            printf("%d ",b[i]);
        printf("%d\n",b[n]);
    }
}

18:30~19:30 观看预备役课堂学长讲题

20:00~21:00 反省刷题中出现的问题,深入探究

今天在那个“签到送气球”的题碰灰之后,我特意向身边的大佬请教了一下什么时候应该加getchar(),总之,如果进行标准输入%c或%s前输入有%d,那么应在这些字符的输入前加入getchar()吸收掉遗留的空白字符,而且,在语句scanf("%d %c %s",&team[i].a,&team[i].id,team[i].status),getchar();中,格式符之间的空格(也可是其他空白字符)表示吸收掉这个范围内输入的所有空白字符。

猜你喜欢

转载自blog.csdn.net/qq_52852840/article/details/112853116