CSP-J第二轮试题-2021年-3题

news2024/11/24 2:15:44

文章目录

    • 参考:
    • 总结
  • [CSP-J 2021] 网络连接
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 样例 #3
      • 样例输入 #3
      • 样例输出 #3
    • 样例 #4
      • 样例输入 #4
      • 样例输出 #4
    • 提示
    • 答案1
    • 答案2
  • 现场真题注意事项

在这里插入图片描述

参考:

https://www.luogu.com.cn/problem/P7911

总结

本系列为CSP-J/S算法竞赛真题讲解,会按照年份分析每年的真题,并给出对应的答案。本文为2021年真题。
https://www.luogu.com.cn/problem/list?tag=343&page=1

[CSP-J 2021] 网络连接

题目描述

TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务,就是尝试利用这个协议,还原一个简化后的网络连接场景。

在本问题中,计算机分为两大类:服务机(Server)和客户机(Client)。服务机负责建立连接,客户机负责加入连接。

需要进行网络连接的计算机共有 n n n 台,编号为 1 ∼ n 1 \sim n 1n,这些机器将按编号递增的顺序,依次发起一条建立连接或加入连接的操作。

每台机器在尝试建立或加入连接时需要提供一个地址串。服务机提供的地址串表示它尝试建立连接的地址,客户机提供的地址串表示它尝试加入连接的地址。

一个符合规范的地址串应当具有以下特征:

  1. 必须形如 a.b.c.d:e 的格式,其中 a , b , c , d , e a, b, c, d, e a,b,c,d,e 均为非负整数;
  2. 0 ≤ a , b , c , d ≤ 255 0 \le a, b, c, d \le 255 0a,b,c,d255 0 ≤ e ≤ 65535 0 \le e \le 65535 0e65535
  3. a , b , c , d , e a, b, c, d, e a,b,c,d,e 均不能含有多余的前导 0 0 0

相应地,不符合规范的地址串可能具有以下特征:

  1. 不是形如 a.b.c.d:e 格式的字符串,例如含有多于 3 3 3 个字符 . 或多于 1 1 1 个字符 : 等情况;
  2. 整数 a , b , c , d , e a, b, c, d, e a,b,c,d,e 中某一个或多个超出上述范围;
  3. 整数 a , b , c , d , e a, b, c, d, e a,b,c,d,e 中某一个或多个含有多余的前导 0 0 0

例如,地址串 192.168.0.255:80 是符合规范的,但 192.168.0.999:80192.168.00.1:10192.168.0.1:088192:168:0:1.233 均是不符合规范的。

如果服务机或客户机在发起操作时提供的地址串不符合规范,这条操作将被直接忽略。

在本问题中,我们假定凡是符合上述规范的地址串均可参与正常的连接,你无需考虑每个地址串的实际意义。

由于网络阻塞等原因,不允许两台服务机使用相同的地址串,如果此类现象发生,后一台尝试建立连接的服务机将会无法成功建立连接;除此之外,凡是提供符合规范的地址串的服务机均可成功建立连接。

如果某台提供符合规范的地址的客户机在尝试加入连接时,与先前某台已经成功建立连接的服务机提供的地址串相同,这台客户机就可以成功加入连接,并称其连接到这台服务机;如果找不到这样的服务机,则认为这台客户机无法成功加入连接。

请注意,尽管不允许两台不同的服务机使用相同的地址串,但多台客户机使用同样的地址串,以及同一台服务机同时被多台客户机连接的情况是被允许的。

你的任务很简单:在给出每台计算机的类型以及地址串之后,判断这台计算机的连接情况。

输入格式

第一行,一个正整数 n n n

接下来 n n n 行,每行两个字符串 o p , a d \mathit{op}, \mathit{ad} op,ad,按照编号从小到大给出每台计算机的类型及地址串。

其中 o p \mathit{op} op 保证为字符串 ServerClient 之一, a d \mathit{ad} ad 为一个长度不超过 25 25 25 的,仅由数字、字符 . 和字符 : 组成的非空字符串。

每行的两个字符串之间用恰好一个空格分隔开,每行的末尾没有多余的空格。

输出格式

输出共 n n n 行,每行一个正整数或字符串表示第 i i i 台计算机的连接状态。其中:

如果第 i i i 台计算机为服务机,则:

  1. 如果其提供符合规范的地址串且成功建立连接,输出字符串 OK
  2. 如果其提供符合规范的地址串,但由于先前有相同地址串的服务机而无法成功建立连接,输出字符串 FAIL
  3. 如果其提供的地址串不是符合规范的地址串,输出字符串 ERR

如果第 i i i 台计算机为客户机,则:

  1. 如果其提供符合规范的地址串且成功加入连接,输出一个正整数表示这台客户机连接到的服务机的编号。
  2. 如果其提供符合规范的地址串,但无法成功加入连接时,输出字符串 FAIL
  3. 如果其提供的地址串不是符合规范的地址串,输出字符串 ERR

样例 #1

样例输入 #1

5
Server 192.168.1.1:8080
Server 192.168.1.1:8080
Client 192.168.1.1:8080
Client 192.168.1.1:80
Client 192.168.1.1:99999

样例输出 #1

OK
FAIL
1
FAIL
ERR

样例 #2

样例输入 #2

10
Server 192.168.1.1:80
Client 192.168.1.1:80
Client 192.168.1.1:8080
Server 192.168.1.1:80
Server 192.168.1.1:8080
Server 192.168.1.999:0
Client 192.168.1.1.8080
Client 192.168.1.1:8080
Client 192.168.1.1:80
Client 192.168.1.999:0

样例输出 #2

OK
1
FAIL
FAIL
OK
ERR
ERR
5
1
ERR

样例 #3

样例输入 #3

见附件中的 network/network3.in。

样例输出 #3

见附件中的 network/network3.ans。

样例 #4

样例输入 #4

见附件中的 network/network4.in。

样例输出 #4

见附件中的 network/network4.ans。

提示

【样例解释 #1】

计算机 1 1 1 为服务机,提供符合规范的地址串 192.168.1.1:8080,成功建立连接;

计算机 2 2 2 为服务机,提供与计算机 1 1 1 相同的地址串,未能成功建立连接;

计算机 3 3 3 为客户机,提供符合规范的地址串 192.168.1.1:8080,成功加入连接,并连接到服务机 1 1 1

计算机 4 4 4 为客户机,提供符合规范的地址串 192.168.1.1:80,找不到服务机与其连接;

计算机 5 5 5 为客户机,提供的地址串 192.168.1.1:99999 不符合规范。

【数据范围】

测试点编号 n ≤ n \le n特殊性质
1 1 1 10 10 10性质 1 2 3
2 ∼ 3 2 \sim 3 23 100 100 100性质 1 2 3
4 ∼ 5 4 \sim 5 45 1000 1000 1000性质 1 2 3
6 ∼ 8 6 \sim 8 68 1000 1000 1000性质 1 2
9 ∼ 11 9 \sim 11 911 1000 1000 1000性质 1
12 ∼ 13 12 \sim 13 1213 1000 1000 1000性质 2
14 ∼ 15 14 \sim 15 1415 1000 1000 1000性质 4
16 ∼ 17 16 \sim 17 1617 1000 1000 1000性质 5
18 ∼ 20 18 \sim 20 1820 1000 1000 1000无特殊性质

“性质 1”为:保证所有的地址串均符合规范;
“性质 2”为:保证对于任意两台不同的计算机,如果它们同为服务机或者同为客户机,则它们提供的地址串一定不同;
“性质 3”为:保证任意一台服务机的编号都小于所有的客户机;
“性质 4”为:保证所有的地址串均形如 a.b.c.d:e 的格式,其中 a , b , c , d , e a, b, c, d, e a,b,c,d,e 均为不超过 10 9 {10}^9 109 且不含有多余前导 0 0 0 的非负整数;
“性质 5”为:保证所有的地址串均形如 a.b.c.d:e 的格式,其中 a , b , c , d , e a, b, c, d, e a,b,c,d,e 均为只含有数字的非空字符串。

对于 100 % 100 \% 100% 的数据,保证 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000

【提供 hack 数据感谢】

  • xyf007。

答案1

#include <bits/stdc++.h>
//#include<cstdio>//必须包含cstdio头文件
//#include<iostream>
using namespace std;


int n;
bool check(string ip){

    return true;
}
map<string,int> server;

int main(){
	//freopen("candy.in","r",stdin);
	//freopen("candy.out","w",stdout);
    cin>>n;
    string s,t;
    for(int i=1;i<=n;i++){
        cin>>s>>t;
        if(!check(t)){ //检查ip地址是否合法
                cout<<"ERR"<<endl;
                continue;
        }
        if(s =="Server"){
                if(server[t]==0){
                    server[t]=i;
                    cout <<"OK"<<endl;
                }else{
                    cout<<"FAIL"<<endl;
                }
        }else{
            if(server[t]>0){
                cout<<server[t]<<endl;
            }else{
                cout<<"FAIL"<<endl;
            }
        }
    }

//    system("pause");
	//fclose(stdin);
	//fclose(stdout);


	return 0;
}

在这里插入图片描述

#include <bits/stdc++.h>
//#include<cstdio>//必须包含cstdio头文件
//#include<iostream>
using namespace std;

struct node{
    int id;
    string sorc;
    string ip;
}a[1010];

bool check(string ip){

    return true;
}

int n;
int main(){


	//freopen("candy.in","r",stdin);
	//freopen("candy.out","w",stdout);
	// 接收一个n n为ip的数量
	cin>>n;


	// 循环
	for(int i=1;i<=n;i++){
        // 接收 op(Server or Client)  ad(adress)
        string op,ad;
        cin>>op>>ad;
        // 判断ip 错误输出ERR
        if(!check(ad)){
            cout<<"ERR"<<endl;
        }

        // 判断数组为空 server直接进入OK,Client直接错FAIL
        if(i==1){
            if(op=="Server"){
                a[i].id=i;
                a[i].sorc="Server";
                a[i].ip=ad;
                cout<<"OK"<<endl;
                continue;
            }else{
                cout<<"FAIL"<<endl;
                continue;
            }
        }
        //int l = sizeof(a)/sizeof(a[0]);


        for(int j=1;j<=n;j++){
            if(op=="Server"){
                if(a[j].sorc=="Server"){
                    if(ad==a[j].ip){

                        cout<<"FAIL"<<endl;
                        break;
                    }
                }else if(j==n){
                    a[i].id=i;
                    a[i].sorc="Server";
                    a[i].ip=ad;
                    cout<<"OK"<<endl;
                }

            }else{
                if(a[j].sorc=="Server"){
                    if(ad==a[j].ip){
                        cout<<a[j].id<<endl;
                        break;
                    }
                }else if(j==n){
                    cout<<"FAIL"<<endl;
                }
            }
        }
	}
    //system("pause");
	//fclose(stdin);
	//fclose(stdout);


	return 0;
}


答案2

#include <bits/stdc++.h>
//#include<cstdio>//必须包含cstdio头文件
//#include<iostream>
using namespace std;


int n;
bool check(string ip){
    int t[6] = {0,-1,-1,-1,-1,-1};
    int cnt=sscanf(ip.c_str(),"%d.%d.%d.%d:%d",
                   &t[1],&t[2],&t[3],&t[4],&t[5]);
    if(cnt!=5) return false;
    for(int i=1;i<=4;i++){
        if(t[i]<0||t[i]>255) return false;
    }
    if(t[5]<0 || t[5]>65535) return false;
    char now[30];
    sprintf(now,"%d.%d.%d.%d:%d",t[1],t[2],t[3],t[4],t[5]);
    if(string(now) !=ip) return false;
    return true;
}
map<string,int> server;

int main(){
	//freopen("candy.in","r",stdin);
	//freopen("candy.out","w",stdout);
    cin>>n;
    string s,t;
    for(int i=1;i<=n;i++){
        cin>>s>>t;
        if(!check(t)){ //检查ip地址是否合法
                cout<<"ERR"<<endl;
                continue;
        }
        if(s =="Server"){
                if(server[t]==0){
                    server[t]=i;
                    cout <<"OK"<<endl;
                }else{
                    cout<<"FAIL"<<endl;
                }
        }else{
            if(server[t]>0){
                cout<<server[t]<<endl;
            }else{
                cout<<"FAIL"<<endl;
            }
        }
    }

//    system("pause");
	//fclose(stdin);
	//fclose(stdout);


	return 0;
}

在这里插入图片描述

现场真题注意事项

https://cspoj.com/contest.php?cid=1002
Fus5yz4x3EcSJH1Z

注意事项

  1. 文件名(程序名和输入输出文件名)必须使用英文小写。(提交必须使用freopen()进行提交)
  2. C/C++ 中函数 main() 的返回值类型必须是 int,程序正常结束时的返回值必须是0。
  3. 提交的程序代码文件的放置位置请参考各省的具体要求。
  4. 因违反以上三点而出现的错误或问题,申述时一律不予受理。
  5. 若无特殊说明,结果的比较方式为全文比较(过滤行末空格及文末回车)。
  6. 程序可使用的栈空间内存限制与题目的内存限制一致。
  7. 全国统一评测时采用的机器配置为:Inter® Core™ i7-8700K CPU @3.70GHz,内存 32GB。上述时限以此配置为准。
  8. 只提供 Linux 格式附加样例文件。
  9. 评测在当前最新公布的 NOI Linux 下进行,各语言的编译器版本以此为准

/*
假设输入样例数据存在文件test.in中,输出样例数据存在文件test.out中,
则在CSP、NOI等比赛的代码中,需添加freopen、fclose语句,
内容详见模板代码如下。
*/

#include <bits/stdc++.h>
#include<cstdio>//必须包含cstdio头文件
#include<iostream>
using namespace std;
 
int main(){
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	
	cout<<"Hello NOI"<<endl;
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}

下面为函数的简介,详细可参见 http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html
函数名:freopen
声明:FILE *freopen( const char *path, const char *mode, FILE *stream );
所在文件: stdio.h
参数说明:
path: 文件名,用于存储输入输出的自定义文件名。
mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。
stream: 一个文件,通常使用标准流文件。
返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。(一般可以不使用它的返回值)
功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    freopen("7532.in", "r", stdin);
    freopen("7532.out", "w", stdout);
    //原来的代码保持不变
    double a, b, r;
    int k;
    cin >> a >> b;
    k = int(a/b);
    r = a - b * k;
    printf("%g", r);
    //-------------
    fclose(stdin);
    fclose(stdout);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 MyBatis 进行批量插入操作

使用 MyBatis 进行批量插入操作 批量插入是在数据库中同时插入多条记录的操作&#xff0c;通常用于提高数据插入的效率&#xff0c;特别是在需要大量数据导入或初始化时。MyBatis是一款流行的Java持久层框架&#xff0c;它提供了简单而强大的方式来执行批量插入操作。本文将介…

【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)

目录 一、前言 &#x1f34e; 为什么要学习非线性结构 ---- 树&#xff08;Tree&#xff09; &#x1f4a6; 线性结构的优缺点 &#x1f4a6; 优化方案 ----- 树&#xff08;Tree&#xff09; &#x1f4a6; 树的讲解流程 二、树的概念及结构 &#x1f350; 树的概念 &…

vue + openlayer 按路径移动

示例 创建一个方形的规矩&#xff0c;并让点按轨迹移动。效果如下: 源代码 <template><div><div id"map" class"map"></div><button id"start-animation" ref"startButton">Start Animation</bu…

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频&#xff1a; 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…

Cursor不要太好用,看图见真相

看图见真相: Cursor安装地址: https://www.cursor.so/

02_静态链接和简单宕机分享

ARM64寄存器 Arm64提供31个64bit通用寄存器 汇编用x表示64位宽 w32位宽 X0~X7: 用于传递子程序参数和结果&#xff0c;使用时不需要保存&#xff0c;多余参数采用堆栈传递&#xff0c;64位返回结果采用x0表示&#xff0c;128位 返回结果采用X1:X0 表示。 X24到x28 看得出来子…

C++容器之unordered_map、unordered_set的底层剖析

文中源码以上传至Gitee 目录 序列式容器和关联式容器unordered_set和unordered_map 哈希表概念 哈希函数与哈希冲突常用的哈希函数直接定址法除留余数法 哈希冲突处理方案开放定址法链地址法开放定地址法和链地址法对比 开放定址法实现链地址法实现unordered_map和unordered_s…

什么是SQL注入(SQL Injection)?如何预防它

什么是 SQL 注入&#xff08;SQL Injection&#xff09;&#xff1f;如何预防它&#xff1f; SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者通过在应用程序的输入中插入恶意SQL代码来执行未经授权的数据库操作。SQL注入攻击可能导…

CSP-J第二轮试题-2020年-4题

文章目录 参考&#xff1a;总结 [CSP-J2020] 方格取数题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例 1 解释 样例 2 解释 数据规模与约定 答案1 现场真题注意事项 参考&#xff1a; P7074 [CSP-J2020] 方格取数 总结 本系…

Docker 自动化部署(实践)

常用命令 docker search jenkins查看需要的jenkins镜像源 docker pull jenkins/jenkins 拉取jenkins镜像 docker images查看下载的镜像源 docker ps 查看包含启动以及未启动的容器 docker ps -a查看启动的容器 docker rm 容器id/容器名称 删除容器 docker rm -f 容器id/容器名…

算法基础课第一部分

算法基础课 第一讲 基础算法快速排序归并排序二分整数二分模板AcWing 789. 数的范围(整数二分法)AcWing 1236.递增三元组AcWing 730. 机器人跳跃问题AcWing 1227. 分巧克力AcWing 1221. 四平方和(二分法/哈希)蓝桥杯-扫地机器人 (二分贪心)AcWing 790. 数的三次方根(浮点二分法…

NSSCTF做题(6)

[HCTF 2018]Warmup 查看源代码得到 开始代码审计 <?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist ["source">"source.php","hint"…

Java-API简析_java.util.Objects类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/133463511 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

人工智能的学习算法

1956年&#xff0c;几个计算机科学家相聚在达特茅斯会议&#xff0c;提出了 “人工智能” 的概念&#xff0c;梦想着用当时刚刚出现的计算机来构造复杂的、拥有与人类智慧同样本质特性的机器。其后&#xff0c;人工智能就一直萦绕于人们的脑海之中&#xff0c;并在科研实验室中…

K折交叉验证——cross_val_score函数使用说明

在机器学习中&#xff0c;许多算法中多个超参数&#xff0c;超参数的取值不同会导致结果差异很大&#xff0c;如何确定最优的超参数&#xff1f;此时就需要进行交叉验证的方法&#xff0c;sklearn给我们提供了相应的cross_val_score函数&#xff0c;可对数据集进行交叉验证划分…

小程序是一种伪需求技术吗?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

[NOIP2012 提高组] 开车旅行

[NOIP2012 提高组] 开车旅行 题目描述 小 A \text{A} A 和小 B \text{B} B 决定利用假期外出旅行&#xff0c;他们将想去的城市从 $1 $ 到 n n n 编号&#xff0c;且编号较小的城市在编号较大的城市的西边&#xff0c;已知各个城市的海拔高度互不相同&#xff0c;记城市 …

零基础一站式精通安卓逆向2023最新版(第一天):Android Studio的安装与配置

目录 一、Android Studio 开发环境的下载二、Android Studio 的安装与配置2.1 安装2.2 Android SDK 的管理 三、创建 Android 应用程序补充&#xff1a;安装完 Android Studio 后 SDK 目录下没有 tools 目录 一、Android Studio 开发环境的下载 通常情况下&#xff0c;为了提高…

对pyside6中的textedit进行自定义,实现按回车可以触发事件。

我的实现方法是&#xff0c;先用qt designer写好界面&#xff0c;如下图&#xff1a; 接着将其生成的ui文件编译成为py文件。 找到里面这几行代码&#xff1a; self.textEdit QTextEdit(self.centralwidget)self.textEdit.setObjectName(u"textEdit")self.textEdit…

Vue城市选择器示例(省市区三级)

Vue城市选择器&#xff08;省市区&#xff09; 读者可以参考下面的省市区三级联动代码思路&#xff0c;切记要仔细研究透彻&#xff0c;学习交流才是我们的本意&#xff0c;而非一成不变。切记切记&#xff01; 最近又重读苏子的词&#xff0c;颇为感慨&#xff0c;愿与诸君共…