寒假快乐刷题第二天
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();中,格式符之间的空格(也可是其他空白字符)表示吸收掉这个范围内输入的所有空白字符。