Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). )

ops/2025/3/10 11:50:58/

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). )

在这里插入图片描述
在这里插入图片描述

题目大意:

在这个交互式问题中,你需要通过查询系统,逐步找出隐藏的位字符串 S。给定一个偶数 n,表示目标位字符串 S 的长度,你需要通过与系统交互,查询一组长度为 n 的二进制字符串 Q。系统会返回一个整数,表示字符串 Q 与目标字符串 S 在对应位置上相同的位数。

定义一个交互问题 Jump(Q),如下所示:

  • OneMax(Q) = nOneMax(Q) = n / 2 时,Jump(Q) 返回 OneMax(Q)
  • 其他情况下,Jump(Q) 返回 0

其中 OneMax(Q) 表示字符串 Q 中与隐藏字符串 S 相同的位数。你的目标是通过最少的查询次数,找出字符串 S

问题的特点:

  • 其实你会发现,你找到n/2的答案时用不了任何算法,你如直接挂茅台随机
  • 因为你会发现随机出答案 n/2 容易得多,不需要花多少次数,你不能指望直接随机到 n,因为这几乎不可能。
  • 从 n/2 推到n就很简单了吧,先把第一位翻转,之后循环后面的每一位,看看与第一位上的数正误是否相同。就这么简单。

题解思路:

本题的关键在于如何通过交互查询逐步逼近隐藏的字符串 S。可以通过以下步骤实现:

  1. 随机生成字符串:首先可以随机生成一个二进制字符串 Q,并查询系统的反馈值。如果反馈值为 n,则说明已经找到正确的字符串,直接退出。

  2. 逐步修改字符串:如果查询的结果不是 n,则意味着 QS 不完全相同。在这种情况下,我们可以逐步修改 Q,通过改变某些位,并再次查询,直到找到正确的字符串。修改的方法可以是根据当前查询的反馈,逐步调整字符串,直到最终使查询结果为 n

  3. 查询反馈:对于每一次查询,你会得到反馈:

    • 0:表示 QS 在任何位置上都没有匹配。
    • n / 2:表示 QSn / 2 个位置上匹配。
    • n:表示 Q 完全匹配 S
  4. 优化查询次数:尽可能减少查询次数。通过不断逼近目标字符串 S,每次通过修改少量位来增加匹配的位数,从而更快找到 S

代码解析:

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define BoBoowen ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int N = 5e5 + 10;
mt19937 rnd(114514);  // 用于生成随机int n;// 用于发送查询并获取反馈
int query(string s)
{int ans = 0;cout << s << endl;  // 输出查询字符串cin >> ans;         // 获取反馈return ans;
}// 生成一个随机的查询字符串并进行查询
string pre()
{while (1){string s;for (int i = 0; i < n; i++)  // 生成长度为n的随机二进制字符串{s += rnd() % 2 + '0';}int ans = query(s);  // 查询if (ans == n)  // 如果完全匹配,退出{exit(0);}if (ans == n / 2)  // 如果有n/2个匹配位,返回该字符串return s;}
}signed main()
{cin >> n;  // 读取字符串长度string t = pre();  // 生成随机字符串并进行查询t[0] ^= 1;  // 翻转第一个字符vector<int> s1;s1.push_back(0);// 尝试修改其他字符for (int i = 1; i < n; i++){t[i] ^= 1;  // 翻转第i个字符int ans = query(t);  // 查询t[i] ^= 1;  // 恢复原状态if (ans != n / 2)  // 如果返回的结果不是n/2,则记录该字符位置s1.push_back(i);}t[0] ^= 1;  // 恢复第一个字符for (auto v : s1)  // 翻转记录的字符位置t[v] ^= 1;int ans = query(t);  // 再次查询if (ans == n)  // 如果完全匹配,退出return 0;if (ans == 0)  // 如果没有匹配,翻转所有位输出{for (int i = 0; i < n; i++)t[i] ^= 1;cout << t;return 0;}
}

代码流程:

  1. 生成随机字符串并查询

    • 通过 pre() 函数生成一个随机的二进制字符串,并查询系统的反馈值。
    • 如果反馈值为 n,说明已经找到目标字符串,程序终止。
    • 如果反馈值为 n / 2,返回该字符串进行进一步操作。
  2. 修改字符串并查询

    • 对生成的随机字符串逐步修改,翻转某些位,检查每次修改后的反馈结果。
    • 如果反馈值为 n / 2,则继续修改,直到找到正确的字符串。
  3. 输出结果

    • 当查询结果为 n 时,输出结果并退出。
    • 如果查询结果为 0,说明字符串完全不同,需要将所有位翻转并输出。

总结:

这道题目需要通过查询与反馈来逐步找出隐藏的目标字符串。通过对字符串的逐位修改和反馈的解析,我们能够有效地逼近并最终找到目标字符串 S


http://www.ppmy.cn/ops/164651.html

相关文章

mysql安装(演示为mac安装流程)

mysql安装 前言安装流程1、下载mysql安装包2、安装步骤设置mysql的密码(密码需要时8位数字以上的)然后点击finish(完成)3、查看是否安装成功4、如果运行mysql -u root -p报错:zsh: command not found: mysql解决方案首先查看mysql的安装路径在终端中切换到这个路径下打开b…

C/S架构与B/S架构

一、定义与核心区别 C/S架构&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09; 客户端需安装专用软件&#xff08;如QQ、企业ERP系统&#xff09;&#xff0c;直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点&#xff1a;客户端承担部分计算任务…

hbase实训 阿达

《HBase实训&#xff1a;探索分布式数据库的实战之旅》 在当今数据驱动的世界里&#xff0c;处理海量数据的能力是科技和科研人员必须掌握的一项技能。HBase作为一款基于Hadoop的分布式数据库&#xff0c;因其强大的扩展性和高效的随机读写性能而受到广泛青睐。今天&#xff0…

手写Tomcat

Tomcat是什么&#xff1f; Tomcat 是一个开源的、轻量级的 Servlet 容器&#xff0c;也被称为 Web 服务器&#xff0c;由 Apache 软件基金会的 Jakarta 项目开发&#xff0c;在 Java Web 开发领域应用广泛。 1&#xff09;Servlet 容器&#xff1a;Servlet 是 Java 语言编写的…

02C#基本结构篇(D1_基本语法)

目录 一、前言 二、using 关键字 三、class 关键字 四、C# 中的注释 五、成员变量 六、成员函数 七、实例化一个类 八、标识符 九、C# 关键字 十一、顶级语句&#xff08;Top-Level Statements&#xff09; 实例一 实例二 实例三 注意事项 十二、Java与C#的语法区…

10.2 继承与多态

文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性&#xff0c;派生类提供更丰富的属性和行为。在构造派生类时&#xff0c;其基类构造函数先被调用&#xff0c;然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…

【AVRCP】协议深入解析(1):从框架到数据单元

目录 一、AVRCP 协议框架 1.1 AV/C 命令 1.2 AVRCP 特定的 AV/C 命令 1.3 AVRCP 特定的浏览命令 二、定时器设置 三、协议数据单元(PDU)描述 3.1 PDU 格式概述 3.2 AVRCP 特定的 AV/C PDU 格式 3.3 AVRCP 特定的浏览 PDU 格式 四、总结 五、参考文献 AVRCP(Audio…

让知识触手可及!基于Neo4j的机械设备知识图谱问答系统

让知识触手可及&#xff01;基于Neo4j的机械设备知识图谱问答系统 在信息化迅速发展的今天&#xff0c;我们如何高效地利用海量数据&#xff1f;我们推出的“机械设备知识图谱问答展示系统”&#xff0c;正是为了解决这个难题而生。这个系统不仅能帮助我们快速获取机械设备的知…