Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4Mobile wallpaper 5Mobile wallpaper 6
3160 字
16 分钟
洛谷刷题03
2025-12-16
C

P14758 役满之泪#

题目背景#

又是一个平淡无奇的下午,我正在家津津有味的吃着白水煮挂面就着咸菜,我幻想着这样美好而又平淡的一天或许能一直下去。但不曾料到,这样的生活将与我快速告别。

“开门,役满委喵!“急切的敲门打断了我的吃饭,还不容我反应过来,大门就被人粗糙的闯开。迎面走过来的,是因为急切而面部通红的一姬。

“有人举报你在铜之间役满,老领导你不介意我们检查一下吧?”

我看着她拿着明晃晃的立直棒,那意气风发的样子让我不禁想到当初我们刚见面的时候,似乎也是这样一个午后,我带着她第一次来到铜之间,看着她稚嫩的样子,我告诉她在铜之间,我们只能断幺九。

“明白了师傅喵!“她郑重点头的样子,此刻竟没来由的在脑海挥之不去。

“当然没问题。“仍然沉浸在回忆里,我的过去替我回答了她。

“报告,检查到完美对局和役满之证!都是今天的!“听到旁边人说话,我才意识到我好像神游了很久。我抬起头看向了一姬,她此刻也在看我,用着一种好熟悉的眼神。

太熟悉了,那种眼神,此刻我又在魂游,我想起来了,那个眼神,是我带她第一次胡了断幺九后的那种志得意满,是我告诉她未来我们要截胡所有役满的胸有成竹,是我陪着她在初心点铳后的坚定无畏。可为什么,明明这么熟悉的眼神,我再看向她的时候怎么感觉她在不忍她在后悔她在恨铁不成钢?突然感觉意识越来越深。

“这是哪儿的对局啊,你们给我看这个干什么?”

“这不是你的对局吗?”

“什么是我的对局,我怎么可能有这种对局,这个役满这么多分,我说实话我想都不敢想啊!”

“对,你是不敢想,但是你敢胡,你是个三人场的胡北人啊!”

“给师傅看一下牌谱喵!”

“这又能说明什么,这是我朋友的号,我今天只是登录赚小鱼干的!”

“账号密码还记得吧,我带你看看游戏记录。”

“这号不是你的,这游戏记录还不是你的喵?”

“不是我的啊一姬,这是谁啊,拿我的号打国士,这谁啊这不是成心想害我吗!”

“你承认这是你的号了喵?”

突然像是进去了默片,一姬说完那句话我感觉像是听到了自己的心跳。回想刚刚我们俩的对白,感觉像是在看一场上个世纪的马戏演出。刚刚那是我在说话吗,为什么我要说那些话,我为什么感觉自己越来越矮,意识逐渐模糊,我甚至意识不到自己在张嘴说话……

“一姬,这个积分我是一点都不敢花啊,我祖祖辈辈都是初心,被别人飞怕了,积分一分不动,全在铜之间啊!”

“你大把大把胡牌的时候怎么没想到自己是初心的孩子,现在出事了,说自己是初心,番种里这么多役,怎么有你这个坏人胡役满……”

题目描述#

在本题中,你不需要知道日本麻将的完整规则,你只需要知道以下几点:

  • 日本麻将使用的牌是一万~九万、一索~九索、一饼~九饼、东风、南风、西风、北风、红中、绿发、白板各 44 张,共 3434 种,136136 张。
  • 每个人手中初始有 1313 张牌。
  • 每次摸一张牌后,需要打出一张牌。
  • 每次摸牌后,手牌数量将变为 1414 张,此时若构成可以和牌的牌型,则可以自摸和牌。

在日麻中,“国士无双”是一种常见的役满牌型,它是指由三种序数牌的幺、九牌,七种字牌共 1313 张中的 1212 个单张及 11 对组成的和牌,即一万、九万、一索、九索、一饼、九饼、东风、南风、西风、北风、红中、绿发、白板这 1313 种牌手中都要有,且其中一种要有一对才能和牌。

revclos 正在打麻将,作为役满人,他想在本局中自摸和出”国士无双”!revclos 给你目前他手中一万、九万、一索、九索、一饼、九饼、东风、南风、西风、北风、红中、绿发、白板这 1313 种牌每种牌的数量,他想要知道:至少需要再摸多少次牌,才能自摸和出国士无双。

输入格式#

输入 1313 个非负整数,分别表示 revclos 目前手中一万、九万、一索、九索、一饼、九饼、东风、南风、西风、北风、红中、绿发、白板这 1313 种牌的数量。

保证这些这 1313 个数均为 0,1,2,3,40,1,2,3,4 其中之一,且它们的和不超过 1313

输出格式#

输出一个整数,表示 revclos 要自摸和出国士无双至少需要的摸牌次数。

输入输出样例 #1#

输入 #1#

1 1 1 1 1 1 1 1 1 1 1 1 1

输出 #1#

1

输入输出样例 #2#

输入 #2#

1 1 1 1 1 1 1 1 1 1 1 0 2

输出 #2#

1

输入输出样例 #3#

输入 #3#

2 2 0 0 0 0 1 1 1 1 1 1 1

输出 #3#

4

源码#

#include <stdio.h>
#include <stdlib.h>
int main() {
int a[13];
for (int i = 0;i < 13; i++) {
scanf("%d", &a[i]);
}
int sum = 0;
int best =0;
for (int i = 0; i < 13; i++) {
if (a[i]==0) sum++;
best = best || (a[i] > 1);
}
int num = 0;
if (best==1){
num = sum;
}else if (best ==0){
num = sum +1;
}
printf("%d\n", num);
system("pause");
return 0;
}

这道题的逻辑也很简单,先检查有没有雀头(一种牌已经存在两张),如果有的话就看有几个零就好了,如果没有,输出就需要再多加一个

在写的时候遇到过一个小问题

for (int i = 0; i < 13; i++) {
if (a[i]==0) sum++;
best = best || (a[i] > 1);
}

一开始这一段代码是这样的

for (int i = 0; i < 13; i++) {
if (a[i]==0) sum++;
if (a[i]>1) best++;
}

因为我需要的只是它的布尔值,也就是0 or 1 ,但是通过这样编码就会将这个数据变得很复杂,这样不好

于是我就把它改成了这样

for (int i = 0; i < 13; i++) {
if (a[i]==0) sum++;
best = (a[i] > 1);
}

这样返回的倒是0 or 1 了,但是又存在一个问题,因为它放在for循环里,所以best会不断的重新赋值,最后只能判断最后一个数据,现在这种写法是问ai得到的

for (int i = 0; i < 13; i++) {
if (a[i]==0) sum++;
best = best || (a[i] > 1);
}

通过一个关系判断||就实现了ture判断的延续,反正我是没想到的,还是缺乏意识

P14749 名字取好了#

题目描述#

13 点 52 分,伟大 whx 教练看到学生们在 ICPC 报名网站上填反姓和名的情况超级无敌暴怒,登上全美热搜。

就在今年,东秦 ACM 队为学校打出了前无古人的整整 20 队次的参赛名额,whx 超级激动狂喜。

然而就在 ICPC 官网报名通道关闭前,教练核对最终名单时,眼前一黑——有一些队员的姓和名,在系统里是完全倒着写的!

现在给你原网站上的 first name,last name,接收状态(只有 Accepted 和 Rejected 两种结果),求改正后的姓名结果。

输入格式#

读入共一行,三个字符串,用空格隔开,分别代表原网站上的 first name,last name,接收状态。

字符串长度均不超过 10001000

输出格式#

输出共一行,代表改正后的 first name,last name。

输入输出样例 #1#

输入 #1#

Brother Call Accepted

输出 #1#

Brother Call

输入输出样例 #2#

输入 #2#

Call Brother Rejected

输出 #2#

Brother Call

源码#

#include <stdio.h>
#include <string.h>
int main() {
char first[1005], last[1005], status[1005];
scanf("%s %s %s", first, last, status);
if (strcmp(status, "Accepted") == 0) {
printf("%s %s\n", first, last);
} else {
printf("%s %s\n", last, first);
}
return 0;
}

about <string.h>#

概述#

#include <string.h>是C语言标准库中处理字符串操作的核心头文件,它提供了丰富的函数集来处理字符数组(即C语言中的字符串)。由于C语言没有内置的字符串类型,这些函数成为了处理文本数据的基石。

函数名作用用法示例返回值说明
strlen计算字符串长度(不包含’\0’)strlen("hello")返回字符串的字符数量
strcpy字符串复制strcpy(dest, src)返回目标字符串指针
strncpy安全字符串复制(限制长度)strncpy(dest, src, n)复制最多n个字符
strcat字符串连接strcat(dest, src)将src追加到dest末尾
strncat安全字符串连接strncat(dest, src, n)追加最多n个字符
strcmp字符串比较strcmp(str1, str2)相等返回0,小于返回负数,大于返回正数
strncmp安全字符串比较strncmp(str1, str2, n)比较前n个字符
strchr查找字符首次出现位置strchr(str, 'a')返回字符指针,未找到返回NULL
strstr查找子串首次出现位置strstr(haystack, needle)返回子串起始指针,未找到返回NULL
strtok字符串分割strtok(str, ",")返回分割后的第一个子串
memset内存块初始化memset(ptr, 0, size)设置内存块所有字节为指定值
memcpy内存块复制memcpy(dest, src, n)复制n个字节,不处理内存重叠
memmove安全内存块移动memmove(dest, src, n)复制n个字节,处理内存重叠
memcmp内存块比较memcmp(ptr1, ptr2, n)比较两个内存块内容

%c%s 的区别#

核心概念对比#

格式说明符用途对应数据类型特点
%c单个字符char一次处理一个字符,不会自动添加终止符
%s字符串char[]char*处理整个字符串,需要’\0’终止符

P14747 相似字符串#

题目描述#

I(大写的 i)和 l(小写的 L)这两个字符看起来非常相似。

定义两个字符串是相似的,当且仅当认为字符 Il 相同的情况下这两个字符串相同。

现在给你两个长度相同的字符串,你需要判断这两个字符串是否是相似的。

输入格式#

输入共两行,每行一个仅由大小写字母组成的字符串。

保证两个字符串的长度相同且不超过 2020

输出格式#

输出一行一个字符串,若两个字符串是相似的,输出 YES,否则输出 NO(不区分大小写)。

输入输出样例 #1#

输入 #1#

BrotherCall
BrotherCalI

输出 #1#

YES

输入输出样例 #2#

输入 #2#

revclos
revolcs

输出 #2#

NO

输入输出样例 #3#

输入 #3#

aabIlIlIlIl
aabIIIllllI

输出 #3#

YES

输入输出样例 #4#

输入 #4#

Il
Il

输出 #4#

YES

源码#

#include <stdio.h>
#include <stdlib.h>
int main() {
char str1[21];
char str2[21];
int a = 1;
scanf("%s", str1);
scanf("%s", str2);
for (int i = 0; i < 20 && str1[i] != '\0'; i++) {
if (str1[i] != str2[i]) {
if ( !((str1[i] == 'I' || str1[i] == 'l') && (str2[i] == 'I' || str2[i] == 'l')) ) {
a = 0;
break;
}
}
}
if (a == 1) {
printf("YES");
} else if (a == 0) {
printf("NO");
}
system("pause");
return 0;
}

真的累了,疯狂调试,运行逻辑很简单,但是编码疯狂出错

第一个问题#

for (int i = 0; i < 20 && str1[i] != '\0'; i++) {
}

这一部分一开始为

for (int i = 0; i < 20; i++) {
}

缺少了输出结束后的中止,导致如果输入的字符串只有 3 个字符(比如 "abc"),循环会一直跑到 20。当 i=319 时,会去比较内存里的垃圾值(乱码)。如果乱码不相等,程序就会误判为 NO

第二个问题#

if ( !((str1[i] == 'I' || str1[i] == 'l') && (str2[i] == 'I' || str2[i] == 'l')) )

这里的逻辑判断

if ( !((str1[i] == 'I' || str2[i] == 'l') && (str1[i] == 'I' || str2[i] == 'l')) ) {

如果 str1'l'str2'I',这个条件判断会出错,导致误判为 NO。

例如aabIlIlIlIlaabIIIllllI

在第 5 个字符(下标 i=4)时,判断逻辑是:

(str1[i] == 'I' || str2[i] == 'l')
  • 检查 str1[i] == 'I'? -> (它是 'l'
  • 检查 str2[i] == 'l'? -> (它是 'I'
  • 结果:这个括号里的条件变成了 False(假)。
洛谷刷题03
https://btop251.vercel.app/posts/c语言学习/洛谷刷题03/
作者
btop251
发布于
2025-12-16
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时