首页 > 其他分享 >交互题使用指南

交互题使用指南

时间:2024-08-11 18:20:06浏览次数:18  
标签:函数 int extern grader cpp 使用指南 交互

一般 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 交互题板块。

标签:函数,int,extern,grader,cpp,使用指南,交互
From: https://www.cnblogs.com/hutongzhou/p/18352461

相关文章

  • java流程控制:用户交互Scanner
    1.首先输入newScanner然后Alt+回车建立一个扫描器2.选择使用next方式或者nextLine方式进行接收3.使用if判断用户是否输入字符串,有hasNext和hasNextLine两种4.定义一个变量为next或nextLine方式5.输出该方式6.关闭IO类,防止占用资源next和nextLine方式的区别next......
  • 扩展【从0制作自己的ros导航小车】C++_ROS_QT5联合编译,简单界面为ROS开发增添交互
    从0制作自己的ros导航小车前言一、环境搭建二、联合编译三、测试前言前面已经实现了导航功能,对于之后的一些开发,有交互能力是比较重要的,比如小车上连接一块屏幕,通过屏幕来选择模式,可视化等等。QT是不错的选择,但是需要做一些额外的工作,让QT与ROS能够建立联系,实现通信......
  • 2024最新版PyCharm下载安装详细教程,Python环境配置和使用指南,零基础保姆级教程
    一、简介PyCharm是一款PythonIDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如,调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。Pytho......
  • 【kali系列】Metasploit Framework (MSF) 从基础到进阶使用指南
    引言一、MetasploitFramework介绍1.1MSF概述1.2MSF主要组件二、MetasploitFramework基础安装与配置2.1KaliLinux中的MSF2.2非KaliLinux环境下的安装2.3更新与升级三、MetasploitFramework基础用法3.1启动MSF控制台......
  • 《DNK210使用指南 -CanMV版 V1.0》第十八章 machine.Timer类实验
    第十八章machine.Timer类实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5......
  • python3如何使用‘pexpect’自动与串口交互?
    如何在Windows中使用python'pexpect'自动与串口(例如:COM3)交互并在开机时通过串口登录嵌入式开发板时输入用户密码?ser=serial.Serial(port=serial_port,baudrate=baudrate,bytesize=bytesize,parity=parity,stopbits=stopbits,timeout=timeout)channel=pexpect.fdpexp......
  • 夜莺监控使用指南
    夜莺监控使用指南本文用于解决在部署和应用夜莺监控中遇到的一些问题以及官方文档缺失的某些步骤可能会遇到的坑。安装过程我使用是Nightingale+Categraf+Prometheus的架构。Nightingale安装文档:https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v7/instal......
  • python和sliver交互
    开源第三方库:https://sliverpy.readthedocs.io/en/latest/getting-started.html#connect-example代码示例:importosimportasynciofromsliverimportSliverClientConfig,SliverClientCONFIG_PATH=os.path.join('../sliver/','moloch_127.0.0.1.cfg')......
  • 教程 | USB-IF USBCV软件工具使用指南
    一.概述CVTest是基于USBCV软件工具的合规性测试,可以验证设备是否符合USB规范和标准。USBCV则是USB-IF提供的一款免费USB装置测试软体,简要做USB2.0及USB3.0装置相关测试。本文将基于NXPLPC5516HID类键盘简要讲解USBCV中公有USB请求测试及HID类测试步......
  • 第6章>>实验6:PS(ARM)端Linux RT与PL端FPGA之间(通过Reg寄存器进行通信和交互)-《LabVIEW Z
    1、实验内容       前面第五章入门实验和上一个实验5里面我们向大家展示通过了布尔类型的Reg寄存器通道实现了ZYNQPS端ARM和PL端FPGA二者之间的开关量交互,抛砖引玉。       从本节实验开始,接下来4个实验我们将着重向大家讲解更为通用和更为全面的4种交互方......