第一次做交互题。

题意是有n个数(n<1000),你通过问1 a b,后台返回你YES代表a<b,NO代表a>b。要你在10000次询问内给出一个符合的排列。n=1000来说,10000其实就是大约nlogn。

所以需要一个时间复杂度稳定为nlogn的排序,每次询问的结果对应cmp函数的返回值。
然后顺便了解一下stable sort:

  • 稳定排序,它的这个稳定,主要是两个相同的元素,它不会改变原来的相对位置。
  • 它是怎么判断两个元素是否相同的呢? cmp(x,y) ==0 && cmp(y,x)==0 时就是相同的,所以你cmp的返回值应该是x>y,不是x>=y,否则稳定排序就失去意义了。
  • 另外,一般情况下它用归并排序,在空间不足的情况下,它采用的是merge_without_buffer函数,也就是就地排序,这时的复杂度就是O(n*logn*logn)了。

这题我们用它单纯的只是需要它的归并排序而已,并没有用到相对位置的稳定性。如果是sort,用的是快排,时间复杂度不是稳定的O(nlogn),而归并排序是稳定的O(nlogn)。

#include<bits/stdc++.h>
using namespace std;
#define N 10005
int n;
int a[N];
char s[];
int cmp(int a,int b){
printf("1 %d %d\n",a,b);
fflush(stdout);
scanf("%s",s);
return s[]=='Y';
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)a[i]=i;
stable_sort(a+, a++n, cmp);
for(int i = ;i<=n;i++)
printf("%d ", a[i]);
printf("\n");
fflush(stdout);
return ;
}

  我们也可以用二分来做这题:

#include<cstdio>
#include<cstring>
#define N 10005
int n;
int a[N];
char s[];
int main(){
scanf("%d",&n);
a[]=;
for(int i=;i<=n;i++){
int l=,r=i;//已经排好了前i-1个
while(l<r){
int m=(l+r)>>;
printf("1 %d %d\n",i,a[m]);
fflush(stdout);
scanf("%s",s);
if(s[]=='Y') r=m;
else l=m+;
}
for(int j=i;j>l;j--)
a[j]=a[j-];
a[l]=i;
}
for(int i = ;i<=n;i++)
printf("%d ", a[i]);
printf("\n");
fflush(stdout);
return ;
}
  

【Gym 100685J】Just Another Disney Problem(交互/排序)的更多相关文章

  1. CodeForces Gym 100685J Just Another Disney Problem (STL,排序)

    题意:给定你大小未知的n个数,你允许有不超过一万次的询问,每次询问两个数,第i个数是否比第j个数小?然后后台会返回给你一个结果YES或者NO(即一行输入), 然后经过多次询问后,你需要给出一个正确的原 ...

  2. HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. Codeforces Gym 100513D D. Data Center 前缀和 排序

    D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/proble ...

  4. codeforces1088D_Ehab and another another xor problem交互题

    传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...

  5. 2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序

    分析:首先,利用贪心可知,如果要所有人的分数和最高,需要把序号大的优先放在前面.其次,对于a的前面不能为b,那么只能a在b前面了,那么就建立一条从a到b的边,并且b的入度加1.然后就是拓扑排序了.要分 ...

  6. 【Gym 100015A】Another Rock-Paper-Scissors Problem

    题 题意 Sonny出石头剪刀布的猜拳策略是 先出R,然后每连续两段都是打败前一段的出拳, 现在问你第n回合打败他要出什么. 分析 他的策略 R P S PSR  SRP PSRSRPRPS SRPR ...

  7. Codeforces.1088D.Ehab and another another xor problem(交互 思路)

    题目链接 边颓边写了半上午A掉啦233(本来就是被无数人过掉的好吗→_→) 首先可以\(Query\)一次得到\(a,b\)的大小关系(\(c=d=0\)). 然后发现我们是可以逐位比较出\(a,b\ ...

  8. 2019春季训练02: JU Flash Contest Gym - 102035 训练报告与复盘

    这场题极其简单 Solved 19 / 19 A Gym 102035A N integers 略 Solved 10 / 33 B Gym 102035B Mahmoud the Thief 用ma ...

  9. 选择问题(selection problem)

    /*     本文是选择问题: 选择一组N个数当中的第k小的数(第k大的数类似)     集中方法的实现代码 */       #include "sorting.h" #incl ...

随机推荐

  1. POJ 2387 Til the Cows Come Home --最短路模板题

    Dijkstra模板题,也可以用Floyd算法. 关于Dijkstra算法有两种写法,只有一点细节不同,思想是一样的. 写法1: #include <iostream> #include ...

  2. RabbitMQ 一二事 - 简单队列使用

    消息队列目前流行的有三种 1. RabbitMQ 2. ActiveMQ 3. Kafka 这三种都非常强大,RabbitMQ目前用的比较多,也比较流行,阿里也在用 ActiveMQ是阿帕奇出品,但是 ...

  3. 搜索服务Solr集群搭建 使用ZooKeeper作为代理层

    上篇文章搭建了zookeeper集群 那好,今天就可以搭建solr搜服服务的集群了,这个和redis 集群不同,是需要zk管理的,作为一个代理层 安装四个tomcat,修改其端口号不能冲突.8080~ ...

  4. JavaWeb学习----JSTL标签库

    一.JSTL简介: JSTL全名为JavaServer Pages Standard Tag Library,中文名称为JSP标准标签函数库,目前最新的版本为1.2.JSTL是由JCP(Java Co ...

  5. sqlzoo.net刷题

    只发后面提升题目的题解,前面的太简单,写下来也没有意义 12.查找尤金•奧尼爾EUGENE O'NEILL得獎的所有細節 Find all details of the prize won by EU ...

  6. localStroage的用法

    Cookie 每个域名存储量比较小(各浏览器不同,大致4K) 所有域名的存储量有限制(各浏览器不同,大致4K) 有个数限制(各浏览器不同) 会随请求发送到服务器 LocalStorage 永久存储 单 ...

  7. jquery中$("#afui").get(0)为什么要加get(0)呢?

    jquery中$("#afui").get(0)为什么要加get(0)呢? 2015-04-13 17:46SYYZZ3 | 浏览 509 次  Jquery $("#a ...

  8. 11Spring_AOP编程(AspectJ)_概述

    AspectJ 是一个框架 (第三方AOP框架 ),提供切面编程 ,编写一个Aspect 支持多个Advice和多个PointCut .对比前一种提到的传统的Aop编程,AspctJ更加的常用.Asp ...

  9. 查询Sqlserver数据库死锁的一个存储过程(转)

    链接 :http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html 使用sqlserver作为数据库的应用系统,都避免不了有时候会产 ...

  10. C# 通过消息捕获处理窗体最大化/最小化

    通过以下的一些代码可以实现捕获相关的一些消息事件; 以及可以通过调用 SetCloseMenu();实现关闭一些按钮功能如屏蔽关闭按钮功能等; 需要添加命名空间:using System.Runtim ...