P14758 役满之泪
题目背景
又是一个平淡无奇的下午,我正在家津津有味的吃着白水煮挂面就着咸菜,我幻想着这样美好而又平淡的一天或许能一直下去。但不曾料到,这样的生活将与我快速告别。
“开门,役满委喵!“急切的敲门打断了我的吃饭,还不容我反应过来,大门就被人粗糙的闯开。迎面走过来的,是因为急切而面部通红的一姬。
“有人举报你在铜之间役满,老领导你不介意我们检查一下吧?”
我看着她拿着明晃晃的立直棒,那意气风发的样子让我不禁想到当初我们刚见面的时候,似乎也是这样一个午后,我带着她第一次来到铜之间,看着她稚嫩的样子,我告诉她在铜之间,我们只能断幺九。
“明白了师傅喵!“她郑重点头的样子,此刻竟没来由的在脑海挥之不去。
“当然没问题。“仍然沉浸在回忆里,我的过去替我回答了她。
“报告,检查到完美对局和役满之证!都是今天的!“听到旁边人说话,我才意识到我好像神游了很久。我抬起头看向了一姬,她此刻也在看我,用着一种好熟悉的眼神。
太熟悉了,那种眼神,此刻我又在魂游,我想起来了,那个眼神,是我带她第一次胡了断幺九后的那种志得意满,是我告诉她未来我们要截胡所有役满的胸有成竹,是我陪着她在初心点铳后的坚定无畏。可为什么,明明这么熟悉的眼神,我再看向她的时候怎么感觉她在不忍她在后悔她在恨铁不成钢?突然感觉意识越来越深。
“这是哪儿的对局啊,你们给我看这个干什么?”
“这不是你的对局吗?”
“什么是我的对局,我怎么可能有这种对局,这个役满这么多分,我说实话我想都不敢想啊!”
“对,你是不敢想,但是你敢胡,你是个三人场的胡北人啊!”
“给师傅看一下牌谱喵!”
“这又能说明什么,这是我朋友的号,我今天只是登录赚小鱼干的!”
“账号密码还记得吧,我带你看看游戏记录。”
“这号不是你的,这游戏记录还不是你的喵?”
“不是我的啊一姬,这是谁啊,拿我的号打国士,这谁啊这不是成心想害我吗!”
“你承认这是你的号了喵?”
突然像是进去了默片,一姬说完那句话我感觉像是听到了自己的心跳。回想刚刚我们俩的对白,感觉像是在看一场上个世纪的马戏演出。刚刚那是我在说话吗,为什么我要说那些话,我为什么感觉自己越来越矮,意识逐渐模糊,我甚至意识不到自己在张嘴说话……
“一姬,这个积分我是一点都不敢花啊,我祖祖辈辈都是初心,被别人飞怕了,积分一分不动,全在铜之间啊!”
“你大把大把胡牌的时候怎么没想到自己是初心的孩子,现在出事了,说自己是初心,番种里这么多役,怎么有你这个坏人胡役满……”



题目描述
在本题中,你不需要知道日本麻将的完整规则,你只需要知道以下几点:
- 日本麻将使用的牌是一万~九万、一索~九索、一饼~九饼、东风、南风、西风、北风、红中、绿发、白板各 张,共 种, 张。
- 每个人手中初始有 张牌。
- 每次摸一张牌后,需要打出一张牌。
- 每次摸牌后,手牌数量将变为 张,此时若构成可以和牌的牌型,则可以自摸和牌。
在日麻中,“国士无双”是一种常见的役满牌型,它是指由三种序数牌的幺、九牌,七种字牌共 张中的 个单张及 对组成的和牌,即一万、九万、一索、九索、一饼、九饼、东风、南风、西风、北风、红中、绿发、白板这 种牌手中都要有,且其中一种要有一对才能和牌。
revclos 正在打麻将,作为役满人,他想在本局中自摸和出”国士无双”!revclos 给你目前他手中一万、九万、一索、九索、一饼、九饼、东风、南风、西风、北风、红中、绿发、白板这 种牌每种牌的数量,他想要知道:至少需要再摸多少次牌,才能自摸和出国士无双。
输入格式
输入 个非负整数,分别表示 revclos 目前手中一万、九万、一索、九索、一饼、九饼、东风、南风、西风、北风、红中、绿发、白板这 种牌的数量。
保证这些这 个数均为 其中之一,且它们的和不超过 。
输出格式
输出一个整数,表示 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,接收状态。
字符串长度均不超过 。
输出格式
输出共一行,代表改正后的 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)这两个字符看起来非常相似。
定义两个字符串是相似的,当且仅当认为字符 I 和 l 相同的情况下这两个字符串相同。
现在给你两个长度相同的字符串,你需要判断这两个字符串是否是相似的。
输入格式
输入共两行,每行一个仅由大小写字母组成的字符串。
保证两个字符串的长度相同且不超过 。
输出格式
输出一行一个字符串,若两个字符串是相似的,输出 YES,否则输出 NO(不区分大小写)。
输入输出样例 #1
输入 #1
BrotherCallBrotherCalI输出 #1
YES输入输出样例 #2
输入 #2
revclosrevolcs输出 #2
NO输入输出样例 #3
输入 #3
aabIlIlIlIlaabIIIllllI输出 #3
YES输入输出样例 #4
输入 #4
IlIl输出 #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=3 到 19 时,会去比较内存里的垃圾值(乱码)。如果乱码不相等,程序就会误判为 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。
例如aabIlIlIlIl 和 aabIIIllllI
在第 5 个字符(下标 i=4)时,判断逻辑是:
(str1[i] == 'I' || str2[i] == 'l')- 检查
str1[i] == 'I'? -> 错(它是'l') - 检查
str2[i] == 'l'? -> 错(它是'I') - 结果:这个括号里的条件变成了 False(假)。
部分信息可能已经过时









