编写一个最简单的交互式题目

简单交互题选讲&交互题浅谈 文章目录一些定义与技巧一些例题例1. [CF1167B]Lost NumbersDescriptionSolution例2. [CF1407C]Chocalate BunnyDescriptionSolution例3. [CF1451E2]Bitwise QueriesDescriptionSolutionSummary例4. [CF1114E]Arithmetic ProgressionDescriptionSolutionSummary 一些定义与技巧 交互题,顾名思义,你需要用电脑与官方机器交流,从而 阅读详情

    最近无聊学着编了一下交互式类型的题目。平常网上交互式题目的库文件源码并不多见,在这里把我写的一个题目分享给大家,希望对大家能够有帮助。

    题目是一个经典问题,下面所引用的内容是全部的题目描述:

Problem : famous
谁是名人

问题描述
    Matrix67所在的小镇上有N(2<=N<=1000)个人,它们从1到N编号。在小镇中,一些人认识另一些人,这种认识的关系是单向的。一个人是名人当且仅当小镇上所有的人都认识他,而除他之外的所有N-1个人他都不认识。假设这个小镇上有且只有一个名人,而你只能询问诸如“A是否认识B”这样的关系。请用不超过2000次的询问找到这个名人。

交互方法
    这个题目是一个交互式的题目。我们不提供输入文件,同时也不需要任何输出文件。你需要调用一个我们准备好的库函数来完成所有的操作。你可以得到libfam.ppu和libfam.o两个文件。你需要把这两个文件放在和你的源程序相同的目录下,并在源程序里加入“uses libfam”完成对库文件的引用。我们的库文件提供了以下两个函数和一个过程:
      function init:longint;
      function know(a,b:longint):boolean;
      procedure submit(sol:longint);

    init函数只能调用一次。这个函数仅在程序开始时调用,他将返回N值,代表小镇上的人数。
    函数know(a,b)返回一个布尔值,它告知了编号为a的人与编号为b的人的关系。如果该函数返回true,则你获得了“a认识b”这一信息;如果该函数返回false,则你获得了“a不认识b”这一信息。该函数可以多次调用,每调用一次称做为一次询问。你的询问次数不能超过2000次,也就是说,该函数最多被调用2000次。
    submit过程只能调用一次。这个过程仅在程序结束时调用,用于提交你得到的答案,所带的参数即是名人的编号。调用这个过程将终止你的程序,你可以在日志文件中看到反馈信息。

一个成功交互的例子
    下面这一程序代码说明了如何进行正确的操作。除了解释如何使用交互库之外,这个代码不具有任何意义。它不具有提示你询问方法的作用。

program famous;
uses libfam;

var
   n:longint;
   foo,bar:boolean;
begin
   n:=init;         //初始化,得到N的值
   foo:=know(1,3);  //询问1是否认识3
   bar:=know(n-1,4);  //询问n-1是否认识4
   submit(2);       //所提交的答案为2
end.

你如何测试自己的程序
    我们为选手准备了一种自我测试的方法。你需要在程序所在目录下建立test.in文件并在此文件下输入相关信息。该文件的构成应该如下:
    第一行:一个整数N,代表人数;
    第二行到第N+1行:输入一个01矩阵,数字与数字间用空格分隔。其中,第i行的第j个数字表示i是否认识j,“1”表示认识,“0”表示不认识。当i和j相等时,该位置上的0或1没有意义。
    一个合法的test.in文件内容可能如下:
3
1 1 0
0 0 0
1 1 1
    容易看出,该输入文件表明N=3时的情况,其中第2个人是名人。

    你的程序运行时将读取该文件的相关信息并作为此次测试的数据。
    程序退出后该目录将生成一个名为famous.log的文件。该文件是日志文件,它详细记录了你的程序与库的交互过程。一些可能出现的情况如下(部分语句较长,用...省略):
    Init called more than once.  表明你的程序调用init函数超过1次。
    File not exist.              表明目录里找不到test.in文件或无法打开该文件。
    Error reading N.             读入数字N时出错。该位置可能有其它字符。
    N must between 2 and 1000.   test.in中输入的N范围不正确。N应该在2到1000之间。
    Error reading the matrix.    读入01矩阵时出错。该位置可能有其它字符。
    Numbers in matrix should...  矩阵中出现了除0和1以外的数字。
    No famous person found...    你的输入数据中没有名人。
    Init called successfully.    程序调用init成功,继续运行。
    Too many queries...          你的询问次数超过2000次,程序被迫终止。
    Person # not exist.          你所询问的人不存在。可能你的参数大于了n或小于1。
    You asked a same person: #.  你的程序询问了两个相同的人的关系。
    No.# : # # TRUE/FALSE        依次说明这是第几次询问、询问的两个编号和返回的结果。
    Submitted after # queries.   你的程序成功地提交了答案。同时你可以看到你的总询问次数。
    Your answer: #               这是你提交的答案。
    Congrats, Your answer...     你提交的答案是正确的。你的程序通过了这次测试。
    Oops, Your answer is wrong...你提交的答案是错误的。同时你可以看到正确的答案是多少。


评分方法
    当你提交的答案与我们的正确答案相符时得10分。我们一共将有10次测试,总共100分。
    出现以下情况均不给分:
      程序提交的答案错误或没有提交答案;
      程序运行时间超过1秒;
      程序使用内存空间超过64M;
      程序询问次数超过2000次;
      程序崩溃或意外退出;
      错误访问库导致测试库出错;
      程序访问了其它外部文件。

数据规模
    对于30%的数据,N<=40;
    对于50%的数据,N<=50;
    对于70%的数据,N<=200;
    对于100%的数据,N<=1000。





    下面是这个题目的库文件代码:
unit libfam;

interface

function init:longint;
function know(a,b:longint):boolean;
procedure submit(sol:longint);

implementation

const
   limit=2000;

var
   map:array[1..1000,1..1000]of longint;
   n,ans:longint;
   query:longint=0;
   flog:text;
   inited:boolean=false;

procedure die(msg:string);
begin
   append(flog);
   writeln(flog,msg);
   close(flog);
   halt(1);
end;

procedure wrt(msg:string);
begin
   append(flog);
   writeln(flog,msg);
   close(flog);
end;

function init:longint;
var
   i,j:longint;
   flag:boolean;
begin
   if inited then die('Init called more than once.');

   assign(flog, 'famous.log');
   rewrite(flog);
   close(flog);

   {$i-}
   assign(input,'test.in');
   reset(input);
   if ioresult<>0 then die('File not exist.');
   {$i+}

   {$i-}
   readln(n);
   {$i+}
   if ioresult<>0 then die('Error reading N.');
   if (n<=1) or (n>1000) then die('N must between 2 and 1000.');

   for i:=1 to n do
   for j:=1 to n do
   begin
      {$i-}
      read(map[i,j]);
      {$i+}
      if ioresult<>0 then die('Error reading the matrix.');
      if (map[i,j]<>0) and (map[i,j]<>1) then die('Numbers in matrix should be 0 or 1.');
   end;
   close(input);

   ans:=-1;
   for i:=1 to n do
   begin
      flag:=true;
      for j:=1 to n do if (i<>j) and (map[i,j]=1) then flag:=false;
      for j:=1 to n do if (i<>j) and (map[j,i]=0) then flag:=false;
      if flag then ans:=i;
   end;
   if ans=-1 then die('No famous person found in your input data.');

   wrt('Init called successfully.');
   inited:=true;
   init:=n;
end;

function know(a,b:longint):boolean;
var
   sta,stb,stq:string;
begin
   inc(query);
   str(a,sta);
   str(b,stb);
   str(query,stq);

   if query>limit then die('Too many queries...');
   if (a<1) or (a>n) then die('Person '+sta+' not exist.');
   if (b<1) or (b>n) then die('Person '+stb+' not exist.');
   if a=b then die('You asked a same person: '+sta+'.');

   if map[a,b]=1 then wrt('No.'+stq+': '+sta+' '+stb+' TRUE')
                 else wrt('No.'+stq+': '+sta+' '+stb+' FALSE');
   know:=(map[a,b]=1);
end;

procedure submit(sol:longint);
var
   sts,stq,sta:string;
begin
   str(sol,sts);
   str(query,stq);
   str(ans,sta);
   wrt('');
   wrt('Submitted after '+stq+' queries.');
   wrt('Your answer: '+sts);
   if sol=ans then wrt('Congrats, Your answer is correct!')
              else wrt('Oops, Your answer is wrong! The answer should be '+sta+'.');
   halt(0);
end;

end.



    下面是一个数据生成器。在实际测试中使用的数据文件名并不是“test.in”,防止选手直接读入数据。因此,库的代码中读入部分也要做相应的改动。数据未经过加密,因此这种方法不能彻底防止选手作弊。使用Cena测试时,测试库需要放在Cena目录的compilers/bin下。测试库还需要一些其它的改动,比如log文件可以改为只输出该测试点是否得分的信息(在Cena中设置成用答案正确时应该输出的log文件与实际输出的log文件进行对比)。
const
   c:array[0..9]of longint=
   (2,30,40,47,50,172,200,532,797,1000);
var
   a:array[1..1000,1..1000]of longint;
   i,j,k,n,t:longint;
begin
   randseed:=13875;
   for k:=0 to 9 do
   begin
      assign(output,'fam23z.'+chr(k+48)+'.in');
      rewrite(output);
      n:=c[k];
      for i:=1 to n do
      for j:=1 to n do a[i,j]:=random(2);
      t:=random(n)+1;
      for i:=1 to n do a[i,t]:=1;
      for i:=1 to n do a[t,i]:=0;
      writeln(n);
      for i:=1 to n do
      begin
         for j:=1 to n do write(a[i,j],' ');
         writeln;
      end;
      close(output);
   end;
end.



一个满分程序的代码可能如下:
uses libfam;
var
   i,t,n:integer;
begin
   n:=init;
   t:=1;
   for i:=2 to n do if know(t,i) then t:=i;
   submit(t);
end.


Matrix67原创
转载请注明出处

1584D - Guess the Permutation & 交互题入门 1584D - Guess the Permutation & 交互题入门 一、 交互题简介 第一次做交互题,用了大概半天时间学习了交互题的概念和大致做法 交互题跟一般题相反, 一般题目是系统给你输入数据, 让你输出答案, 系统判断答案是否正确 而交互题则类似于电视节目中的猜数字, 你可以理解为后台有一些数据, 但是需要你去询问, 系统会根据你的询问给你答案, 需要你在规定的询问次数内得到答案并输出 主要的思想是二分、三分、随机数,难点在于几乎无法本地自测 交互题是special judge中的一种 阅读详情

相关推荐

信息学交互题的写法和注意事项总结

信息学交互题的写法和注意事项总结:交互题要求选手与“裁判”进行多次输入输出的交互,通常以多轮交互实现问题的解决。题目的核心在于:如何通过“询问”或“操作”逐步推导出答案或实现目标。

lry421308的博客 1309

【算法竞赛学习笔记】交互题入门

title : 交互题 tags : ACM,交互 date : 2022-2-11 author : Linno 交互题 通俗来讲,交互题与平时题目的输入输出反过来,是让你设计程序去向用户提出询问,由用户给出答案,并且在这基础上由程序推断出正确答案的一种形式。在下面第一道例题中会认识到交互题的基本写法。 应用cf上的话说明怎样调整输入输出: //This is an interactive problem. Remember to flush your output while communicati.

SC_Linno的博客 6342

交互题解题报告

文章目录交互格式IO交互grader交互其他注意事项交互题的本地测试准备IO交互测试grader交互测试题解猜数字2拉面比较 交互格式 交互题一般分为两种:IO交互和grader交互 IO交互 需要包含对应的交互库头文件。 一般题目会在题面定义好每种操作的格式,选手通过打印对应的字符串进行交互。 每次输出后要即时清空缓存,保证交互正常进行。 对于cout,endl时会自动清除缓存。 对于printf,可以使用**fflush(stdout)**清除缓存。 例题:猜数字2 grader交互 需要包含对应的交互

Cafard的博客 1887

如何使用Java编写第一个简单交互式程序

Java第一个程序拿来输出我认了,第二个尝试输出别的我也认了,总不能一直光输出吧,因此便有了这篇介绍输入的交互教程,愉快的Java教程继续!

汝嫣兮的博客 3897

使用Shell编写一个交互式的计算器

脚本内容如下: #!/bin/bash error=0 while true do one="请输入第一个数字 : " two="请输入第二个数字 : " san="请输入(+|-|*|/) : " bb="--------------------" t="输入q或Q退出这个计算器" read -p "$one" num1 if [[ "$num1" == q

qq_42476887的博客 547

非传统题型练习:三道交互式题目

Problem 1: famous 谁是名人题目来源:Matrix67根据经典问题改编    题目和测试库源码直接见http://www.matrix67.com/blog/article.asp?id=179题解:    显然名人最多有一个。问两个还没有问过的人A和B。如果A认识B,那么A肯定不是名人;如果A不认识B,那么B肯定不是名人。总之,结果无论是什么,总有一个人要排除。由于

matrix67的专栏 1760

编写交互式 Shell 脚本

在日常的系统管理和自动化任务中,使用 Shell 脚本可以为我们节省大量时间和精力。文章将以输入IP为例,通过几个版本逐步完善一个Shell交互的案例。

小子宝丁的博客 1917

解释器,一个交互式外壳

“互动”一词可以追溯到拉丁语“interagere”。动词“agere”的意思是“做某事”和“行动”,而“inter”表示事物和事件的空间和时间位置,即“介于”或“介于”对象、人物和事件之间。所以“interagere”的意思是“在这些之间行动”或“在这些之间行动”。 考虑到这一点,我们可以说交互式 shell 位于用户和操作系统(例如 Linux、Unix、Windows 或其他)之间。除了操作系统之外,解释器也可以用于像 Python 这样的编程语言。可以从交互式 shell 中使用 Python 解

pydby01的博客 617

排队 交互式java程序_如何使用Java编写第一个简单交互式程序

今天一天都在忙着补因为之前没有修改默认编码留下的巨坑,还得学着怎么用Git上传到GitHub,本来没打算更的,但是想着要坚持每天最少更一篇的原则,而HTML关于标签的教程还没写好,本着不能糊弄发的想法,就现写Java的交互式程序教程吧。首先,你要知道一个概念,什么叫交互,交互,即交流互动,交互式程序也就是说你能和计算机进行沟通,当然,这里不是指你说什么,计算机就能理解然后像人一样去思考去反应,而是...

weixin_42502366的博客 342

一个简单的sap交互式报表

*&---------------------------------------------------------------------**& Report  ZTEST_REPORT*& 报表练习*&---------------------------------------------------------------------**&create by 冲击波      date

SAP冲击波的专栏 2086

第2讲:编写Python的第一个程序Hello World

在编写Python的第一个程序Hello Word之前,我们先来了解什么是REPL交互式命令行。退出REPL交互式命令行的方法是exit()或者quit()。REPL环境通常用于快速验证小的Python代码片段,当代码的行数较多时,建议使用文本编辑器或者集成环境IDE。

江晓龙的博客 4090

Linux shell/expect交互式脚本编写

交互式脚本主要用于脚本封禁。如soar剧本里面的防火墙联动封禁。 该文档脚本基于expect编写,expect安装支持yum和源码编译。 expect交互式脚本示例: expect脚本 #!/usr/local/bin/expect set timeout 30 set host "172.16.1.58" set username "root" set password "123456" spawn ssh $username@$host expect "*yes*" {send "yes.

a150791038的博客 3958

编写交互式Python程序的艺术

本文深入探讨了如何在Python中使用input()函数接收用户输入,并通过while循环实现程序的交互性。通过多个示例代码展示了如何构建清晰的用户提示、处理数值输入、使用标志变量控制程序流程以及如何利用break语句退出循环。文章还特别提到了在Python 2.7中处理输入的注意事项。

weixin_28988985的博客 331

shell编写交互式设置主机名脚本

每次创建一台虚拟机的时候都需要去执行设置主机名的命令,尝试写了个交互式的脚本来简化设置步骤,以下代码内容供参考

cosann的博客 968

【RTOS】 Vxworks 653 第一章 —— 初识 vx653 3.x

。。不是很重要,自己搜吧鲁棒分区是一种确保共享计算资源中独立运行功能实现​​时空隔离​​的机制,其目标是为集成模块中的混合临界性应用提供与联邦式部署(federated implementation)同等级别的功能隔离保障。具体表现为:​​多关键性共存​​:支持不同安全等级应用(如飞控系统A级与娱乐系统D级)在同一模块中协同运行。​​抗干扰能力​​:防止未授权或意外的时空干扰(如内存越界、时间窗口冲突),确保应用间互不影响。​​。

qq_38183694的博客 1280

全新RGB-D及平面法线数据集DIODE

丰田工业大学联合芝加哥大学和北航发布全新RGB-D及平面法线数据集 DIODE (Dense Indoor and Outdoor DEpth)。

qq_43477338的博客 1539

excel 交互式图表_创建一个交互式Excel图表

excel 交互式图表 创建一个交互式Excel图表 (Create an Interactive Excel Chart)If you add a chart to a dashboard, it’s helpful to let people choose what they’d like to see in the chart. In this example, you’ll choose ...

culiao2169的博客 6114

什么是无人机电源管理模块?电源管理模块有什么用处?

我来描述一下我的问题情景,电源管理模块的定义是,这里给出这个PX4官方对于电源管理模块的一些介绍,补充一下锂电池的放电原理大家就可以更好理解为什么需要电源管理模块

HRWVY0725的博客 2273

尝试——交互式程序编写

关于交互式程序,简单明了的说,就是允许与用户进行交互的程序,或说允许用户进行输入操作。这种程序的好处在于对于一些变量可以依据用户需要进行改变,而不用重新编写一个程序或对程序进行修改,变得更加方便。     而实际上交互程序并不难实现。在通过对书本的研究,发现其实交互式程序不过就是一个scanf()的运用罢了,这是一个输入函数,与之相对的便是输出函数,就是我们都熟悉的printf()。实践才是检验

海阔纵鱼跃,天高任鸟飞 2003

LabVIEW+数据库应用系列保姆级教程,第一篇数据库连接

目录LabVIEW连接数据库的方法连接MySQL连接Oracle,SQL Server,Access等 LabVIEW连接数据库的方法 1、创建udl(Universal Data Link)是通用数据连接文件。界面操作,简单快捷。 2、编写连接字符串。需要熟悉连接字符串的结构,容易出错。 3、其他… 本教程教你使用第1种方法,也是最简单、最常用的方法。 连接MySQL 1、在MySQL Installer内安装MySQL Connector/ODBC,建议安装32位(X86),如下图: 2、创建ODBC

wwplh5520370的博客 1万+

STM32F401RCT6最小系统原理图设计

STM32F401RCT6最小系统原理图设计一、主控芯片二、电源电路三、晶振电路三、下载电路四、完整电路图      本文章基于STM32F401RCT6进行最小系统原理图设计,包含主控芯片,电源,晶振电路,下载电路等几部分 一、主控芯片 主控芯片采用STM32F401RCT6,需注意: VBAT在不接电池的情况下需接3.3V,VDDAVREF+需接3.3V,否则会造成芯片供电不正常,无法启动和识别的情况 VDDAVREF+和VCAP1处电容需按照规格书

weixin_43278295的博客 2万+

shell中交互式变量的编写(用 read 实现变量传递)

1.什么是交互式变量? 当我们在shell中输入一条命令回车的时候,会让填写一些内容才会继续往下走 也就是传统的一问一答的模式 比如passwd命令 2.编写脚本实现交互式的操作 vim test1.sh #!/bin/bash read -p "ni chou sha: " TARGET使用read命令实现交互式 echo "$TARGET" sh test1.sh vim tes...

ymeng9527的博客 3869

KNN算法实现数据分类及matlab完整代码

其基本思想是:对于一个未知样本,找出与该样本距离最近的k个已知样本,然后根据这k个样本的类别来确定该未知样本的类别。在本文中,我们采用iris数据集,该数据集包含四个属性:花萼长度、花萼宽度、花瓣长度、花瓣宽度,以及三个类别:山鸢尾、变色鸢尾、维吉尼亚鸢尾。KNN算法具有简单、直观、易于理解等特点,适用于多分类和二分类问题,但其计算复杂度随着样本数量的增加而增加,也容易受异常值影响。在KNN算法中,常用的距离函数有欧氏距离、曼哈顿距离等。(2)选择距离最近的k个样本,并根据它们的类别来确定未知样本的类别。

qq_39605374的博客 1515

创建一个最简单的FastAPI

五步生成一个最简单的fastapi: 1.导入 FastAPI。 2.创建一个 app 实例。 3.编写一个路径操作装饰器(如:@app.get("/"))。 4.编写一个路径操作函数(如上面的 def root(): ...)。 5.运行开发服务器(如:uvicorn main:app --reload)

Python全栈系列 1497

SMMU软件指南SMMU编程之流表(Stream Table)

SMMU使用一组内存中的数据结构来定位翻译数据,详见“转换过程概述”(Translation process overview)。SMMU_(*_)STRTAB_BASE 存储初始结构(流表,Stream Table)的基地址。流表项(Stream Table Entry, STE)包含二级(Stage 2)转换表的基址指针,同时也定位一级(Stage 1)配置结构,这些配置结构包含转换表的基址指针。 传入事务的 StreamID,由 SEC_SID 进行限定,决定了用于查找的流表,并定位相应的STE。

AI-安全-功耗 1189

机器人多学科仿真软件:Webots_(19).Webots的插件与扩展开发

通过上述步骤,您可以开发和使用Webots的插件、扩展和接口,以增强其功能和灵活性。

kkchenjj的博客 924
上一篇: 祝大家情人节快乐
下一篇: 2.14 送大家一个我很喜欢的图片
matrix67
博客等级 码龄19年 1232粉丝 896原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值