交互题使用指南

news/2024/11/14 15:25:39/文章来源:https://www.cnblogs.com/hutongzhou/p/18352461

一般 oi 场上的交互题都是使用 Grader 交互(cf 是 stdio 交互)。本文讲解一下怎么做交互题,评测交互题。

怎么做

基本知识

题目会给你几个函数接口,一般作为询问的方式。出题人会写一个 grader.cpp 里面就包含了这几个函数。

调用 grader 里面的函数的方法是:加上题目给的头文件/在前面声明要调用的函数(洛谷上用)。

而你要实现一个函数来完成出题人的问题(没有主程序),grader 中有主程序,也就是你完成的是 grader 中的一个函数。

以P1947 猜数为例。

题目上告诉你只用实现 一个函数 Chtholly 来猜数。每次可以调用一个叫 Seniorious 的函数询问是否大于一个数 \(x\)

题目下方会给一个 grader,可以在调试中发挥作用(后文会讲到)。

此题的代码很好写:

#include <cstdio>                        
extern "C" int Seniorious(int);           // 在这里需要声明一次交互库给出的函数。extern "C" int Chtholly(int n, int OvO) {int ans = 1;for (int l = 1, r = n, mid = (l + r) >> 1; l <= r; mid = (l + r) >> 1) if (Seniorious(mid) >= 0) {r = (ans = mid) - 1;} else {l = mid + 1;}return ans;
}

洛谷的交互是用 extern,extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

简单来说就是这个函数在 grader 中被 extern 定义过,可以使用 grader 中的这个函数。而你实现的这个函数也加上的 extern 是因为 grader 也要调用这个函数。

当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是 fun@aBc_int_int#%$ 也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载。

但赛场上一般是申明头文件就可以实现。

如 NOI2019」I 君的探险,申明 #include "explore.h" 就可以调用了,非常方便。

本地调试

在正规 oi 考试中会给你 grader.cpp 以及头文件的 C 文件。把你写的 cpp 文件和它们放在一个文件下:

img

如某次模拟测试,要求实现的 cpp 叫 forge,头文件叫:forge.h。

然后在此目的下打开 cmd,输入:

g++ forge.cpp forge.h grader.cpp -o forge.exe

img

然后会得到一个 exe 文件,打开它输出样例,要想看到答案一定要在 grader.cpp 中写一个 freopen 来输出答案。

img

打开 .out 文件即可得到答案,可以用它来调试。

怎么思考交互题

大概分为两种:答案不变与答案改变,两种的思考方式不一样。还有的题看着像静态的实则是动态的。

就如猜数,有些出题人会把答案设为动态的,根据你的询问来改变答案,只要保证答案符合所有询问即可,如果暴力枚举数字就一定要询问 \(O(n)\) 次才得到答案。

所以许多交互题要看成博弈题来做。

当然还有的出题人为了强制在线才出的交互题。

评测

得到数据后用 lemonlime/lemon 测交互题。

这里假设对 lemon 测传统题已经了解。

交互库路径与名称都是那个头文件,而接口实现路径是那个 grader.cpp。

记住一定要勾选:定向到标准输入/输出。

img

在 data 中不只要放测试点,还有 garder.cpp 以及头文件的 C 文件。

最后测试即可。

后言

如果要自己编写 grader.cpp 一定要防止选手通过一些别样的手段来 AC 这到题。

下发的 grader.cpp 一定要与真实评测时的 grader.cpp 不一样,好的 grader 比选手写的还要长。

参考资料:

  1. Authentic_k:函数式交互题的本地测试方式
  2. chao_yu:C/C++中extern关键字详解
  3. oi wiki 交互题板块。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

028.Vue3入门,子页面通过v-model,把数据实时传给父页面

1、App.vue代码:<template><Father/> </template><script setup> import Father from ./view/Father.vue </script><style> </style>2、Father.vue代码:<template><h3>父页面</h3><p>搜索内容为: {{ sear…

『模拟赛』暑假集训CSP提高模拟18

『模拟赛记录』暑假集训CSP提高模拟18Rank 致敬传奇不挂分 Rank5 模拟赛A. Mortis 原[ABC302G] Sort from 1 to 4 签,致敬传奇 abc_g 作签到题。 虽然但是还是想了 1h,好在最后成功切了。 具体解释看看题解,求个赞。点击查看代码 #include<bits/stdc++.h> using name…

暑假集训CSP提高模拟18

暑假集训CSP提高模拟18 组题人: @H_Kaguya | @joke3579\(T1\) P227. Mortis \(0pts\)原题: [ABC302G] Sort from 1 to 4 | luogu P1459 [USACO2.1] 三值的排序 Sorting a Three-Valued Sequence部分分\(0pts\) :输出逆序对个数。正解设 \(\{ a \}\) 排序后的序列为 \(\{ b \…

选股指标:涨停缩倍阴战法公式

选股指标:涨停缩倍阴战法 作者: 深海游鱼 QQ:396068801 日期:2024年8月 技术交流请加QQ 396068801

指令的执行过程

指令周期 CPU从主存中每取出并执行一条指令所需的全部时间称为指令周期,不同指令的指令周期可能不同。指令周期常常用若干机器周期来表示,机器周期又叫CPU周期。每个指令周期内的机器周期数可以不等指令周期的数据流指令执行方案

乌克兰生存小技巧——坦克炮测距法

乌克兰生活小技巧 第一集 坦克炮测距法 PS:本系列教程假设您的技术在二战的水平。对于一些条件不错的同学来说,可以直接用激光测距解决问题。 众所周知,炮弹发射出去后会有一定程度的下坠,导致可能打不中目标,这时候测距显得极为重要。所以本教程将会带大家如何正确测距,…

在Kali(Debian)系统上安装dockerdocker-compose并给docker配置socks代理

APT换源、docker安装,docker-compose安装,配置docker socks代理在Kali(Debian)系统上安装docker&docker-compose并给docker配置socks代理 安装docker 方法一:使用kali官方的安装方式(经测试,安装的docker版本为20.0) 参考链接如下 Installing Docker on Kali Linux 由于…

bugbountyhunter scope BARKER:第八滴血 存储型 Storage Cross-Site Scripting XSS SVG文件上传 报告

登录后来到home页面,留言中存在一个Attach image检查 xss payload:https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS Injection#xss-in-files使用SVG进行图片上传,发现SVG文件上传成功并返回图片地址poc:https://cfceb12f2bfd-sec875.a.barker-social.…

USB Type-C的工作原理与技术分析

USB TYPE-C更加深入的应用,是从USB3.1开始的,这是因为从USB3.1开始,USB的功能开始变得更加丰富起来。 USB 3.1基本规格有SS字样的代表支持PD,有SS和10的USB标志代表支持USB3.1及PD2.0 历代USB输出功率及标志比较本图来源于:https://www.datapro.net/techinfo/what_is_usb_…

CPU的功能和基本结构

CPU的功能CPU的基本结构运算器控制器CPU中的寄存器 用户可见的寄存器

旧物利用 - 将机顶盒改造为一台Linux开发机!

家里的机顶盒淘汰下来,博主想要物尽其用,看看是否能将其改造为一台Ubuntu"开发机",故开始倒腾前言 机顶盒型号:移动魔百盒CM201-2(CH),芯片组: hi3798mv300(hi3798mv3dmm),其他型号类似 理论上适用于以下SOC:Hi3798Mv100 / Hi3798Cv200 / Hi3798Mv200 / Hi3…

7-3FM模型

FM算法全称为因子分解机 (FactorizationMachine)。它是广告和推荐领域非常著名的算法,在线性回归模型上考虑了特征的二阶交互。适合捕捉大规模稀疏特征(类别特征)当中的特征交互。FM算法全称为因子分解机 (FactorizationMachine)。 它是广告和推荐领域非常著名的算法,在线性回…