【题解·洛谷】B3713 [语言月赛202302] 对了,还有花,少女,银河

#温馨提示:此文章使用的是MD编辑器,在小程序上查看可能会出现乱码,敬请谅解
#本题解有部分文字来源于B3713 [语言月赛202302] 对了,还有花,少女,银河 题解的内容,如果侵犯了您的权益,请联系我删除。

题解目录

  • 题目介绍
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 样例 1 解释
      • 数据规模与约定
  • 题解代码及思路

题目介绍

题目背景

扶苏是洛谷网校的一名讲师,她负责了一场基础-提高衔接计划全真模拟赛。

在全真模拟赛里,需要选手在本地完成代码后按照真实比赛的要求放入以题目名命名的子目录(子文件夹)中,子文件夹的上级文件必须是用考号命名的文件夹。再把用考号命名的文件夹打成 zip。

例如,如果一道题目的名字叫做 ovo,那么源程序必须命名为 ovo.cpp。如果选手考号为 SD-114,那么从 zip 起本题的目录结构必须为:

SD-114.zip/SD-114/ovo/ovo.cpp

这里 / 符号表示的是两级目录之间的间隔。

如果该选手的目录结构变成了 SD-114.zip/SD-114/SD-114/ovo/ovo.cpp(也就是套了两层用考号名命名的文件夹),将无法正常评测。

题目描述

本题难度:普及-
算法标签:字符串(入门)

但是,扶苏生气地发现,即使在前一天晚上已经在群里强调了多次如何打包,并且通过测试赛指出了提交文件目录有问题的选手,但在全真模拟赛时仍有大量同学的目录结构出现问题。

一共有 n n n 名选手参加全真模拟赛,模拟赛共 m m m 道题。给出每道题的名字和每个选手每份源程序的目录结构,请你对于每个选手的每份源程序,判定 ta 的源程序目录是否正确。

选手的错误五花八门,包括但不限于:源程序名写错、考号写错、文件夹套多等等问题。为了方便起见,我们约定对于考号为 X 的选手的题目 YX.zip/X/Y/Y.cpp唯一正确的目录结构,其余结构均为错误结构

注意:同一选手不同题目的上级目录可能是不同的,也可能一个正确一个错误。

输入格式

第一行是两个整数,依次表示参赛选手数 n n n 和题目数 m m m
接下来 m m m 行,每行一个字符串 s i s_i si,表示一道题目的名字。
接下来 ( m + 1 ) × n (m+1) \times n (m+1)×n 行,每 ( m + 1 ) (m+1) (m+1) 行一组表示一名选手的所有题目的目录结构:
每组第一行是一个字符串 t i t_i ti,表示该选手的考号。
接下来 m m m 行,每行一个字符串 r i r_i ri,按题目顺序给出该选手每道题目的目录结构。

输出格式

按输入顺序,对每个选手的每个目录结构,输出一行一个字符串,如果该选手的目录结构正确,输出 Fusu is happy!,否则输出 Fusu is angry!

样例 #1

样例输入 #1

4 2
ovo
vov
SD-114
SD-114.zip/SD-114/ovo/ovo.cpp
SD-114.zip/SD114/vov/vov.cpp
LG-514
LG-514.zip/lg-514/ovo/ovo.cpp
LG-514.zip/LG-514/vov/ovo.cpp
PJ-998
PJ-998.zip/PJ-998/PJ-998/ovo/ovo.cpp
PJ-998/PJ-998/vov/vov.cpp
fusu
fusu.zip/fusu/ovo/ovo.cpp
fusu.zip/fusu/ovo/vov.cpp

样例输出 #1

Fusu is happy!
Fusu is angry!
Fusu is angry!
Fusu is angry!
Fusu is angry!
Fusu is angry!
Fusu is happy!
Fusu is angry!

提示

样例 1 解释

共有 4 4 4 位选手, 2 2 2 道题目。两道题目分别是 ovovov

  • 第一位选手的准考证号是 SD-114
    • 他的第一题目录完全正确。
    • 他第二题的第二级目录(SD114 文件夹)没有加中间的 - 符号,与准考证号不一致,故错误。
  • 第二位选手的准考证号是 LG-514
    • 他第一题的第二级目录使用了小写字母,错误。
    • 他第二题的源程序名写成了 ovo.cpp,应该是 vov.cpp,错误
  • 第三位选手的准考证号是 PJ-998
    • 他第一题的的准考证号目录套了两层(即有两个 PJ-998),故错误。
    • 他第二题没有打 zip 包(第一级目录没有 .zip 后缀),故错误
  • 第四位选手的准考证号是 fusu
    • 她第一题的目录完全正确。
    • 她第二题的子目录(第三级目录)写成了 ovo,因该是 vov,故错误。

数据规模与约定

  • 30 % 30\% 30% 的数据, n = 1 n = 1 n=1
  • 另有 30 % 30\% 30% 的数据, m = 1 m = 1 m=1
  • 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 10 1 \leq n,m\leq 10 1n,m10 s i s_i si t i t_i ti 的长度均不超过 20 20 20 r i r_i ri 的长度不超过 500 500 500。字符串均只含大小写字母、数字和 -./ 符号。保证题目名和准考证号不含 / 符号。
    时间限制: 1.00 s 1.00s 1.00s,空间限制: 128.00 M B 128.00MB 128.00MB

题解代码及思路

在做这题前,我们需要知道这个知识:
string 内置 + + + 运算符,它可以将两个 string 类型(或一个 string 类型和一个字符数组)拼接起来。

例如,如下的代码输出结果为 #include

#include 
#include 
using namespace std;
int main() {
  string a = "#include", b = ";
  string c = a + b + "tream>";
  cout << c << endl;
}

于是,考号为 X 的选手的题目 Y,我们可以得到他本应的目录结构:

string s = X + ".zip/" + X + "/" + Y + "/" + Y + ".cpp";

在读入选手的文件目录 r r r 后,可以直接根据 s == r 的结果检查选手目录结构是否正确,再进行输出即可。

AC代码如下

#include 
using namespace std;
int main(){
    int n,m; // 读取参赛选手数 n 和题目数 m
    cin>>n>>m;
    string b[15];
    for(int i=1;i<=m;i++) cin>>b[i]; // 读取每道题目的名字并存入字符串数组 b 中
    for(int i=1;i<=n;i++){ // 遍历每位选手
        string s;
        cin>>s; // 读取选手的考号
        for(int j=1;j<=m;j++){// 遍历该选手提交的每道题目
            string d;
            cin>>d; // 读取该选手题目的目录结构
            string c=s+".zip/"+s+"/"+b[j]+"/"+b[j]+".cpp"; // 正确的目录结构字符串 c
            if (d==c) // 比较选手提交的目录结构 d 与正确目录结构 c 是否相等
                cout<<"Fusu is happy!"<<endl;
            else
                cout<<"Fusu is angry!"<<endl;
        }
    }
    return 0;
}

你可能感兴趣的:(算法,c++)