非传统题初探——AtCoder Practice Contest #B - インタラクティブ練習 (Interactive Sorting)...

原题:

Time limit : 2sec / Memory limit : 256MB

Score : 300 points

Problem Statement

This is an interactive task.

There are N balls labeled with the first N uppercase letters. The balls have pairwise distinct weights.

You are allowed to ask at most Q queries. In each query, you can compare the weights of two balls (see Input/Output section for details).

Sort the balls in the ascending order of their weights.

Constraints

  • (N,Q)=(26,1000), (26,100), or (5,7).

Partial Score

There are three testsets. Each testset is worth 100 points.

  • In testset 1, N=26 and Q=1000.
  • In testset 2, N=26 and Q=100.
  • In testset 3, N=5 and Q=7.

Input and Output

First, you are given N and Q from Standard Input in the following format:

N Q

Then, you start asking queries (at most Q times). Each query must be printed to Standard Output in the following format:

? c1 c2

Here each of c1 and c2 must be one of the first N uppercase letters, and c1 and c2 must be distinct.

Then, you are given the answer to the query from Standard Input in the following format:

ans

Here ans is either < or >. When ans is <, the ball c2 is heavier than the ball c1, and otherwise the ball c1 is heavier than the ball c2.

Finally, you must print the answer to Standard Output in the following format:

! ans

Here ans must be a string of length N, and it must contain each of the first N uppercase letters once. It must represent the weights of the balls in the ascending order.

Judgement

  • After each output, you must flush Standard Output. Otherwise you may get TLE.
  • After you print the answer, the program must be terminated immediately. Otherwise, the behavior of the judge is undefined.
  • When your output is invalid or incorrect, the behavior of the judge is undefined (it does not necessarily give WA).

题目大意:

这是一道交互题。有$N$个小球,用前$N$个大写字母编号,每个小球有不同的重量。

最多允许询问$Q$次。每次询问可以比较两个小球的重量。

按升序输出小球的质量。

一共有三组数据(子任务),每组数据100分。数据规模如下:

子任务编号$N$$Q$
$1$$26$$1000$
$2$$26$$100$
$3$$5$$7$

注意事项:

  1. 输出一次就要刷新一次标准输出,否则可能会被误判为TLE;
  2. 输出答案后,程序必须立即退出,否则judger的行为未定义;
  3. 若输出答案不符合格式或不正确,judger的行为未定义(不一定给出WA)。

题解:

第一次做交互题,感觉很新鲜,但是不知道该怎么做。首先程序要与交互库进行交互,根据交互库给出的信息判断小球的质量情况。

对于第一个子任务,由于$Q$的范围很大,直接询问$26^2$次进行一次选择排序就可以了。

对于第二个子任务,由于询问次数只有$100$次,我们假设数组已经有序,二分一个小球质量的位置为$mid$,然后与这个位置的小球的质量进行比较,进行一次插入排序即可。需要询问$26\log_226$次,还是不能通过所有的数据。这就要求我们需要对每一次询问的答案做一个记忆化处理,记录下询问小球的质量关系,然后根据这个质量关系就可以得出有序的数列,从而降低时间复杂度,当然如果不记忆化也有可能能够通过这道题目($123$次询问只比限制大一点)。

也可以写一个归并排序之类的东西。当然需要记忆化,记忆化每一个数大于哪些数小于哪些数(或者只记忆化比这个数大的最小的数与比这个数小的最大的数)。

对于第三个子任务,注意到这组数据非常特殊,其实与给$5$个小球,最多称$7$次求出质量关系的问题相同。可以自己思考一下询问次数最小的方案。

#include<bits/stdc++.h>
using namespace std;

char s[29], ans[29];
int cmp['Z'+5]['Z'+5];
int cnt = 0, QQ = 1;

bool cmp_user(const char a, const char b) {
	char cp;
	if(cmp[a][b]==-1) {
		printf("? %c %c\n", a, b);
		fflush(stdout);
		scanf(" %c", &cp);
		if(cp=='>') {
			cmp[a][b] = true;
			cmp[b][a] = false;
			return true;
		}
		else {
			cmp[a][b] = false;
			cmp[b][a] = true;
			return false;
		}
	}
	else return cmp[a][b];
}

void ins2(char c) {
	if(cmp_user(c, s[1])) {
		if(cmp_user(c, s[2])) s[3] = c;
		else s[3] = s[2], s[2] = c;
	} else {
		if(cmp_user(c, s[0])) {
			s[3] = s[2];
			s[2] = s[1];
			s[1] = c;
		} else {
			s[3] = s[2];
			s[2] = s[1];
			s[1] = s[0];
			s[0] = c;
		}
	}
}

void ins(char c) {
	int l = 0, r = cnt;
	while(l<r) {
		int mid = l+r>>1;
		if(cmp_user(c, ans[mid])) l = mid+1;
		else r = mid;
	}
	cnt ++;
	if(cmp_user(c, ans[r])) r ++;
	for(int i=cnt; i>=r+1; i--) ans[i] = ans[i-1];
	ans[r] = c;
}

int main() {
	int N, Q;
	scanf("%d%d", &N, &Q);
	
	for(int i=0; i<26; i++) s[i] = (char)(i+'A');
	s[N] = '\0';
	
	if(N==26) {
		memset(cmp, -1, sizeof(cmp));
		cnt = 0;
		ans[0] = s[0];
		ans[N] = '\0';
		for(int i=1; i<N; i++) ins(s[i]);
		
		printf("! %s\n", ans);
	} else {
		memset(cmp, -1, sizeof(cmp));
		if(cmp_user(s[0], s[1])) swap(s[0], s[1]);
		if(cmp_user(s[2], s[3])) swap(s[2], s[3]);
		if(cmp_user(s[1], s[3])) {
			swap(s[0], s[2]);
			swap(s[1], s[3]);
		}
		char x = s[2];
		if(cmp_user(s[4], s[1])) {
			if(cmp_user(s[4], s[3])) {
				s[2] = s[3];
				ins2(x);
			} else {
				s[2] = s[4];
				s[4] = s[3];
				ins2(x);
			}
		} else {
			if(cmp_user(s[4], s[0])) {
				s[2] = s[1];
				s[1] = s[4];
				s[4] = s[3];
				ins2(x);
			} else {
				s[2] = s[1];
				s[1] = s[0];
				s[0] = s[4];
				s[4] = s[3];
				ins2(x);
			}
		}
		printf("! %s\n", s);
	}
	return 0;
}

  

转载于:https://www.cnblogs.com/TheRoadToAu/p/8463454.html

OPTI Toolbox v2.28 安装与 3 个求解器补全:SCIP、SeDuMi、MOSEK 配置详解 本文详细介绍了OPTI Toolbox v2.28在MATLAB环境下的完整安装指南,包括SCIP、SeDuMi和MOSEK三个关键求解器的配置与优化技巧。通过分步指导和实战案例,帮助用户高效搭建强大的优化工具包,提升混合整数规划、二次约束二次规划等复杂问题的求解效率。 阅读详情

相关推荐

Linux环境下使用线程方式操作UART读写功能

本文介绍Linux环境下使用线程方式操作UART的方法,实现了串口打开,关闭,发送数据,接收数据功能,还编写测试代码,验证该功能。

mftang的博客 2078

交互题入门

纪念一下第一次A掉交互题。 インタラクティブ練習 (Interactive Sorting) B - インタラクティブ練習 (Interactive Sorting) Time Limit: 2 sec / Memory Limit: 256 MB Score : 300 points Problem Statement This is an interactive task. ...

yali_hzy的博客 2865

最近爆火的 Ontology 本体是什么?一文看懂基础概念 + 落地实操

1993 Tom Gruber原版定义:本体是对领域概念化模型的显式形式化规范。1998 Studer完善通用定义:本体是共享、明确、形式化的领域概念模型规范。大白话翻译:本体就是机器能看懂的行业词典+业务规则手册。数据库只管存数据,本体只管定规则,知识图谱是规则+数据结合体。区别于普通开源本体工具,这款国产商用本体平台核心优势:业务沙盘推演、可控业务数据写回、全链路字段级数据血缘审计,适配企业生产级业务落地。

驽马不舍 364

AtCoder practice contest B 归并排序 + 二分 / 贪心 + 信息熵

对于 $n = 26$ 的情况,归并排序最坏情况下需要 $99$ 次比较。对于 $n=5$ 的情况,比较 $c_1,c_2$,再比较 $c_3,c_4$,接着比较两组数据的最小者(不妨假设为 $c_1$),此时得到了一个有序的三元组 $c_1,c_3,c_4$,二分求解 $c_5$ 的位置并插入,此时 $c_1$ 右侧的元素至多为 $3$,再次二分插入 $c_2$ 即可。由于插入一个有序三元组需要二分比较的次数为 $2$,故总比较次数 $3+2+2=7$ 满足条件。

neweryyy的博客 480

adb 通信协议分析以及实现 (三) (Adb 网络通信部分解析)

这篇文章说下adb 和adb 服务进程之间通信的socket 协议。  adb 服务进程启动之后,会监视本地的5037 端口,使用的是TCP 协议,所以adb 发送的命令其实就是往本地的5037 端口发送数据,做过网络编程的都知道,本机可以用127.0.0.1 ip地址。 有了ip 地址和端口号socket 通信就没问题 1)  命令发送方式      

inforecovvery的博客 2869

解码运动想象:BCI Competition IV 2a数据集实战指南

本文提供了BCI Competition IV 2a数据集的实战指南,详细解析了该经典运动想象脑电数据集的结构、文件格式与实验范式。通过MNE-Python等工具,逐步演示了从原始信号读取、预处理(通道选择、滤波、分段)到特征提取(CSP、频带功率)和模型训练(LDA、SVM)的完整流程,并强调了受试者独立评估的重要性,为BCI研究者提供了可复现的入门与进阶路径。

weixin_29304985的博客 362

Atcoder练习场インタラクティブ練習 (Interactive Sorting)

题目链接 第一个点        冒泡排序解决 第二个点        插入排序+二分优化+预处理球之间关系 第三个点        思维???        不太好讲,模拟一下比较好想,        构造一个s[0]&lt;s[1]&lt;s[3]&lt;s[4],然后对于s[2](构造过程中保证了s[2]小于s[4]),插入合适的位置        容易看出四个位置,两次判...

这里RevolIA,_(:з」∠)_ 1514

利用AI辅助工具Codex在30分钟内高效生成发明专利说明书草案

Codex 是什么?简单说,它是 OpenAI 推出的一个高级 AI 工作平台,最初定位是软件开发辅助工具,但现在它的能力边界已经远远超出了写代码。根据 OpenAI 官方信息,每周有超过 500 万人使用 Codex,其中 40% 的新用户是非开发者,包括分析师、营销人员、研究人员等。这意味着 Codex 正在从一个程序员专属工具,演变为一个面向广泛知识工作者的生产力中枢。 那么,它和我们今天要谈的“写发明专利”有什么关系?核心在于 Codex 的“角色专属插件”和“上下文构建”能力。它不再只是根据零散的

weixin_29053067的博客 318

AtCoder Tasks B インタラクティブ練習 (Interactive Sorting)

优化插入法解决交互排序问题

m0_37711725的博客 3420

181、LLC谐振变换器的PCB设计实战(文件归档)

PCB设计实战经验总结:LLC谐振变换器的关键要点 本文通过实际案例总结了LLC谐振变换器PCB设计中的核心经验和常见误区。重点包括: 文件命名规范(项目代号_板卡类型_版本号_日期格式) 四层板标准层叠结构设计要点 谐振回路走线原则(宽度、长度控制) 地线处理技巧(功率地/控制地隔离) 散热设计注意事项(MOSFET过孔阵列、变压器布局) 完整的文件归档清单(Gerber、钻孔、装配图等) 作者特别强调,良好的设计归档习惯能显著降低生产问题概率,建议采用双重备份机制。文中多个真实案例(如谐振频率偏移、EM

Jack010169的博客 40

让 ABAP 开发者也能做出高质量 SAP Fiori:到底需要掌握多少前端知识?

文章摘要: 随着SAP技术演进,ABAP开发者的角色边界正在重构。传统SAP GUI时代的全栈开发模式逐渐转向RAP+Fiori Elements的新范式,其中关键技术变化包括: 开发模式转变:从前后端耦合转向RAP模型驱动开发,通过CDS注解实现UI意图表达 分工优化:Fiori Elements模板处理80%标准UI需求,Flexible Programming Model解决20%差异化需求 效率提升:注解驱动开发可在RAP建模阶段同步定义UI结构,大幅缩短交付周期 工具整合:SAP提供从建模到部署的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 348

AtCoder Regular Contest 112 简单题解(AC 了 A ~ D,缺 E ~ F)

A 题:A - B = C 题目链接 https://atcoder.jp/contests/arc112/tasks/arc112_a。 题解 本题不难,如果数据量不大的话,本题可以使用暴力枚举的方法来解决。也就是在 [L, R] 之间枚举 A 和 B,并计算 C=A-B,这样算法的时间复杂度是的。 我们看看本题的数据范围,本题给了 T 个样例,T 的最大值是 2e4。[L, R] 的最大值是 1e6。如果我们进行暴力枚举的话,计算量将达到,这样的计算量,我们肯定是没有办法在 1 秒内完成...

努力中的老周的专栏 1229

(王道408考研操作系统)第三章内存管理-第一节1:内存基础知识、程序编译运行原理

注意:本节内容和《计算机组成原理》“存储器”那一部分内容相关性很强,组成原理是从硬件角度,操作系统是从软件角度。因此如果没有学习过这部分的同学,强烈建议先看这一部分 王道计算机组成原理笔记 本文主要会涉及以下必要的内存知识 文章目录一:内存及其作用 一:内存及其作用 内存:内存又称之为主存。是一种硬件设备,作为CPU和硬盘的缓冲区,用于解决其速度不匹配的问题,提高整机性能。程序执行前需要放入内存才能运行 ...

快乐江湖的博客 2790

AtCoder Beginner Contest 244 C~F题解

AtCoder Beginner Contest 244 C~F题解

weixin_63785821的博客 285

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

AtCoder入门练习题B--题解报告

一、题目 https://practice.contest.atcoder.jp/tasks/practice_2 二、分析 这里有三组测试用例。 第一组N = 26, Q = 1000。因为N * N &lt; Q,所以可用冒泡排序法。具体代码参考官方给的Sample Code。 第二组N = 26, Q = 100,由于询问次数只有100次,可用插入排序法处理。每插入一个数据前,...

小树学信奥 524

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Atcoder JAG Practice Contest for ACM-ICPC Asia Regional 2012 B - Texas hold 'em(巨型模拟)

点击这里进入题目 作者的话:同学们,我这个方法真的是算烦的,标称只有我的四分之一,但是假如你要深入理解题目我推荐我的程序,假如只是为了图个“方便”,还是别看了。 题目大意:根据德克萨斯扑克的规则,有五张牌应该是明牌,但是此时只明了三张,告诉你你的两张手牌,三张明牌,和对手的三张明牌,求你获胜的概率。 思路:模拟。模拟所有情况,一一对比,典型的思路简单,程序爆难,我大概调了两天。。。...

aoke1952的博客 293

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jeasyui 造成$.data(...) is undefined报错的原因及解决

一、没有正常调用html渲染方法。 【错误代码】 var panel = $('&lt;div data-options="tools:\'#tab-tools\'"&gt;&lt;/div&gt;'); panel.addClass('easyui-tabs'); panel.addClass('tabs-container'); return panel; 【正确代码】 ...

weixin_33859844的博客 547

NEERC 17 I Interactive Sort (交互题)

题意: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;给出1到n这n个数的任意一个排列,然后奇数按顺序分到o数组,偶数按顺序分到e数组,你每次可以询问e数组中第i个和o数组中第j个的大小情况,查询结束后输出结果,查询次数最多30 000次,n≥1000n≥1000n\ge1000 思路: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;我...

Roll_Keyboard的博客 705

Atcoder 萌新 刷题 1

Atcoder 日常刷题 第1天

weixin_47513794的博客 552

hdu-5826 physics(数学)

题目链接: physics Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description There are n balls on a smooth horizontal straight track. The track can be co...

weixin_30466421的博客 149

【ZOJ3929 The 16th Zhejiang University Programming ContestC】【DP】Deque and Balls n个数放入双端队列2^n种方案有多少个位置

Deque and Balls Time Limit: 2 Seconds      Memory Limit: 65536 KB There are n balls, where the i-th ball is labeled as pi. You are going to put n balls into a deque. In the i-th turn, you ne

snowy_smile的博客 860

Atcoder 刷题记录

AGC001 D 回文串构造题,转化:欧拉路径 + 回文串特殊性质(错位和长度奇偶性) 思维题 AGC001E BBQhard 组合数转化成方格路径问题建模 AGC001F WideSwap 拓扑序转化(排列对应的trick)+优化建图(没懂)

Fire Dancer 1318

非传统式题目-交互题练习

以前一直没有做过非传统题 于是便有了这个练习 codeforces 679A 题目大意: 有一个数在\([2,100]\),有不超过20次询问某个数是不是它的约数,判断这个数是不是素数。 题解: [2,100]之间不是素数就是合数(废话) 每个合数的唯一分解式一定是两个及以上的素数 所以枚举所有的素数,由于还有可能是某个素数的平方 所以还要枚举素数的平方,一共询问19次 #include &l...

weixin_30823001的博客 145

【题解】Atcoder ARC#96 F-Sweet Alchemy

  首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\)。既然如此,考虑一棵差分的树,规定每一个节点被选择的次数为 \(x\),表示节点实际上被选择的次数是父亲被选择的次数 \(+x\)。显然,这个 \(x\) 是小于等于 \(D\) 的。分析这样我们发现,选择了一个节点实际上对应子树内的所有节点的选择次...

weixin_30747253的博客 194

非传统题集(交互,提答)

cout<<endl\texttt{cout<<endl}cout<<endl 有 fflush(stdout)\texttt{fflush(stdout)}fflush(stdout) 的作用。 AGC044D Guess the Password 全填一种字符可以确定该字符的个数。 两个串归并的时候通过判断第一个串的首字母加上第二串剩下的所有字母是否是原序列的子序列来确定下一位是否是第一个串的首字母。 CF1354G Find a Gift 注意到 k≤n2k.

Master.Yi的博客 362
上一篇: 洛谷2759 奇怪的函数
下一篇: SDWC2017游记
dav74739
博客等级 码龄12年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值