【Gym 100685J】Just Another Disney Problem(交互/排序)
第一次做交互题。
题意是有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(交互/排序)的更多相关文章
- CodeForces Gym 100685J Just Another Disney Problem (STL,排序)
题意:给定你大小未知的n个数,你允许有不超过一万次的询问,每次询问两个数,第i个数是否比第j个数小?然后后台会返回给你一个结果YES或者NO(即一行输入), 然后经过多次询问后,你需要给出一个正确的原 ...
- HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】
Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- Codeforces Gym 100513D D. Data Center 前缀和 排序
D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/proble ...
- codeforces1088D_Ehab and another another xor problem交互题
传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...
- 2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序
分析:首先,利用贪心可知,如果要所有人的分数和最高,需要把序号大的优先放在前面.其次,对于a的前面不能为b,那么只能a在b前面了,那么就建立一条从a到b的边,并且b的入度加1.然后就是拓扑排序了.要分 ...
- 【Gym 100015A】Another Rock-Paper-Scissors Problem
题 题意 Sonny出石头剪刀布的猜拳策略是 先出R,然后每连续两段都是打败前一段的出拳, 现在问你第n回合打败他要出什么. 分析 他的策略 R P S PSR SRP PSRSRPRPS SRPR ...
- Codeforces.1088D.Ehab and another another xor problem(交互 思路)
题目链接 边颓边写了半上午A掉啦233(本来就是被无数人过掉的好吗→_→) 首先可以\(Query\)一次得到\(a,b\)的大小关系(\(c=d=0\)). 然后发现我们是可以逐位比较出\(a,b\ ...
- 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 ...
- 选择问题(selection problem)
/* 本文是选择问题: 选择一组N个数当中的第k小的数(第k大的数类似) 集中方法的实现代码 */ #include "sorting.h" #incl ...
随机推荐
- C++基础笔记(四)C++内存管理
析构函数 * 析构函数在对象所占用内存释放时调用,通常用来释放相关的资源 * 析构函数就是一个特殊的类成员函数,它是构造函数相反 构造函数:对象在分配内存之后,立即调用 析构函数:对象在内存被释放之前 ...
- 26Spring_的注解实际应用_关键整理一下之前的注解
写一个银行转账案例, 案例结构如下:
- ruby on rails gem install pg时无法安装
gem install pg -v '0.18.2' Building native extensions. This could take a while... ERROR: Error insta ...
- C语言 文件操作9--fgetc()和fputc()
//fgetc()和fputc() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- 一段后台C#查询SQL Server数据库代码
using System; using System.Data; using System.Collections.Generic; using System.Linq; using System.W ...
- LeetCode:Remove Duplicates from Sorted Array I II
LeetCode:Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place su ...
- Linux及安全——ELF实践
Linux及安全——ELF实践 一.分析ELF文件头 二.通过文件头找到section header table,理解内容 三.通过section header table 找到各section 四 ...
- Expectation maximization - EM算法学习总结
原创博客,转载请注明出处 Leavingseason http://www.cnblogs.com/sylvanas2012/p/5053798.html EM框架是一种求解最大似然概率估计的方法.往 ...
- Opencv Linux环境搭建
注:此篇博客最后没有在linux搭建成功Opencv,请移步:http://blog.csdn.net/tanhngbo/article/details/40403885 来查看成功的搭建. 另外,这 ...
- dll,lib文件的导入
这里介绍了两种方式调用,不过我一般用的是第一种,比较方便. 1动态库函数的调用,可以采用静态链接的方式 ,主要步骤如下: 1) 包含DLL中导出的头文件. 2) 采用#pragma comment(l ...