记一道有趣的交互题 noi.ac #2035歪比巴卜
记一道有趣的交互题 noi.ac #2035歪比巴卜
Problem
Alice手上有两个\(\le n\)且不同的正整数\(x,y\),Bob手上有一个正整数\(z\),已经确认是\(x\)或\(y\)中的某一个。 现在除了Alice可以告诉Bob一个正整数\(k\)外,两人不能有任何交流,而Bob需要根据这个数确定\(z=x\)还是\(z=y\)。 请你实现一个程序,帮助Alice决定正整数\(k\),以及帮助Bob根据\(k\)确定\(z=x\)还是\(z=y\)。
你需要实现下面的三个函数:
void init()
对你的程序进行初始化。该函数只会在程序开始运行时被调用恰好一次。
int helpAlice(int x,int y)}
给定一组互不相同的\(x,y\),你要帮助Alice确定kk,并将其作为返回值返回。不是正整数的返回值会导致你获得0分。
int helpBob(int z,int k)
给定一组\(z,k\),保证z是之前某次调用helpAlice(x,y)中的\(x\)或\(y\),且\(k\)是那次调用函数的返回值。 你要帮助Bob确定\(z=x\)还是\(z=y\)并返回相应的值,若\(z=x\),返回1,否则一定有\(z=y\),返回0。不正确的返回值会导致你获得0分。
评测时,交互程序将会首先调用一次init(),然后调用不超过T次helpAlice()和helpBob(),如果任何一次调用的返回值不合法或不正确, 则直接结束并返回00分。如果全部正确,则按照如下如下标准评分:
令所有helpAlice()的返回值中的最大值为R,则你的得分为:

评测时,保证交互程序使用的时间不超过0.5s,空间不超过128MB。
Example
样例
假设交互程序依次调用了如下函数,则一种合法的返回值如下所示:

数据范围与约定
对于\(100\%\)的数据,\(n=920\),\(T=3\times10^6\)。
Solution
首先讲讲交互格式。
最好的方法就是列出1分的代码,应该就可以立马懂了。
void init()
{
}
int helpAlice(int x,int y)
{
return x;
}
int helpBob(int z,int k)
{
if(k==z) return 1;
return 0;
}
\(x,y\le920\),而要得满分则需要做到\(R\le12\)。
这\(920\)和\(12\)之间有什么联系呢?恐怕只有出题人才能想得到吧……
发现\(\binom{12}{6}=924>920\),所以可以将从112中选6个的方案来唯一表示1920中的每一个数。
准确地,对于每次调用函数helpAlice(),记表示\(x\)的集合为\(X\),表示\(y\)的集合为\(Y\),我们找到任意一个在\(X\)当中且不在\(Y\)当中的元素并将其返回。(由于\(x\neq y\),这样的元素必定存在,)
对于每次调用函数helpBob(),记表示\(z\)的集合为\(Z\),若\(k\in Z\),则说明\(z=x\);否则说明\(z=y\).
这样,我们就在tyq把香农的棺材板撬开之前做完了这道题,时间复杂度\(O(2^{12}+T)\).
Code
/**************************************************************
* Problem:
* Author: Vanilla_chan
* Date: 20210318
**************************************************************/
int a[924],h[4096],cnt;
void dfs(int x,int y,int z)
{
if(x==12&&y==6)
{
a[cnt++]=z;
return;
}
if(x<12&&y<=6) dfs(x+1,y,z),dfs(x+1,y+1,z+(1<<x));
}
void init()
{
dfs(0,0,0);
for(int i=1;i<4096;i++)
{
if(i&1) h[i]=0;
else h[i]=h[i>>1]+1;
}
}
int helpAlice(int x,int y)
{
x--;
y--;
return h[a[x]&(~a[y])]+1;
}
int helpBob(int z,int k)
{
z--;
k--;
if(a[z]>>k&1) return 1;
return 0;
}
记一道有趣的交互题 noi.ac #2035歪比巴卜的更多相关文章
- 记一道有趣的Twitter面试题
微信上的“程序员的那些事”想必是很多码农们关注的公众账号之一,我也是其粉丝,每天都会看看里面有没有什么趣事,前段时间“程序员的那些事”分享了一篇博文<我的Twitter技术面试失败了>挺有 ...
- 记一道有意思的算法题Rotate Image(旋转图像)
题出自https://leetcode.com/problems/rotate-image/ 内容为: You are given an n x n 2D matrix representing an ...
- javascript基础修炼(13)——记一道有趣的JS脑洞练习题
目录 一. 题目 二. 解法风暴 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址 ...
- javascript基础修炼(13)——记一道有趣的JS脑洞练习题【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 记一道CTF隐写题解答过程
0x00 前言 由于我是这几天才开始接触隐写这种东西,所以作为新手我想记录一下刚刚所学.这道CTF所需的知识点包括了图片的内容隐藏,mp3隐写,base64解密,当铺解密,可能用到的工具包括bin ...
- 记一道C语言编程题(C语言学习笔记)
题目如下 解答如下 #include <stdio.h> #include<math.h> double Mysqrt(double n) { return sqrt(n); ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
随机推荐
- Raft学习笔记
0.前言 Raft 作为一种强一致性的共识算法,被广泛应用于分布式系统中,如 etcd.Consul 等.最近阅读了一篇关于 Raft 的技术文章,收获颇多,因此写下此学习笔记,记录其中的关键概念与个 ...
- Pydantic递归模型深度校验36计:从无限嵌套到亿级数据的优化法则
title: Pydantic递归模型深度校验36计:从无限嵌套到亿级数据的优化法则 date: 2025/3/26 updated: 2025/3/26 author: cmdragon excer ...
- 【SpringCloud】Zookeeper服务注册与发现
Zookeeper服务注册与发现 Eureka停止更新了,你怎么办 https://github.com/Netflix/eureka/wiki SpringCloud整合Zookeeper替代Eur ...
- CoreOS 更新重启后, 所有容器服务全部停掉了
今天有几个服务出问题了,上去看了下,这台 CoreOS 下的所有容器服务竟然全部停掉了,好奇怪,启动容器时明明加了--detach参数了呀. 问题原因 想了想,会不是是 CoreOS 更新重启导致的, ...
- ChatGTP获取的d读取excel通用程序。
procedure ReadExcelFile(const FileName: string; AMemtable: TFDmemtable); var ExcelApp: OleVariant; S ...
- RAG, GraphRAG, LightRAG, and KAG
KAG: A Better Alternative to RAG for Domain-Specific Knowledge Applications https://medium.com/@ahme ...
- 深入理解Java虚拟机-JAVA内存模型与线程
Java内存模型(JMM) JMM 的核心概念 主内存与工作内存: 主内存(Main Memory)是所有线程共享的内存区域,存放着所有变量的值 每个线程都有自己的 工作内存(Working Memo ...
- 使用python批量爬取wallhaven.cc壁纸站壁纸
偶然发现https://wallhaven.cc/这个壁纸站的壁纸还不错,尤其是更新比较频繁,用python写个脚本爬取 点latest,按照更新先后排序,获得新地址,发现地址是分页展示的,每一页24 ...
- hadoop集群搭建(亲测笔记)
------步骤: 准备3台机器 同步时间 配置主机名 配置主机名ip映射 免密登录 关闭防火墙 搭建zookeeper集群 搭建hadoop 准备3台机器 我通过VMware workstation ...
- 使用TypeScript开发微信小程序(云开发)-入门篇
配置小程序云开发 TypeScript 环境 1. 检查本地 nodejs 环境 2. 安装 TypeScript npm install typescript --save-dev 3. 初始化/配 ...