【Gym 100685J】Just Another Disney Problem(交互/排序)
2016-07-06 10:35
393 查看
第一次做交互题。
题意是有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)。
我们也可以用二分来做这题:
题意是有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 ; char s[10]; int cmp(int a,int b){ printf("1 %d %d\n",a,b); fflush(stdout); scanf("%s",s); return s[0]=='Y'; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)a[i]=i; stable_sort(a+1, a+1+n, cmp); for(int i = 0;i<=n;i++) printf("%d ", a[i]); printf("\n"); fflush(stdout); return 0; }
我们也可以用二分来做这题:
#include<cstdio> #include<cstring> #define N 10005 int n; int a ; char s[10]; int main(){ scanf("%d",&n); a[1]=1; for(int i=2;i<=n;i++){ int l=1,r=i;//已经排好了前i-1个 while(l<r){ int m=(l+r)>>1; printf("1 %d %d\n",i,a[m]); fflush(stdout); scanf("%s",s); if(s[0]=='Y') r=m; else l=m+1; } for(int j=i;j>l;j--) a[j]=a[j-1]; a[l]=i; } for(int i = 0;i<=n;i++) printf("%d ", a[i]); printf("\n"); fflush(stdout); return 0; }
相关文章推荐
- 使用 RMI + ZooKeeper 实现远程调用框架
- 【51Nod 1691】比大小
- RAW格式转换
- ObjectArx 项目编译所出现的问题
- RecyclerView基本使用
- Java 内部类种类及使用解析
- Oracle EBS新建Java 并发程序(Java Concurrent Program)
- Android实现下载功能
- 注册tomcat为服务
- 【小笔记】斜率优化的结论(WC)
- 【POJ 2923】Relocation(状压DP+DP)
- 单例设计模式
- Android Activity中使用Intent实现页面跳转与参数传递的方法
- 在linux shell中不显示路径了,显示为-bash-4.1
- CHM文件(已编译的 HTML 帮助文件)打开不显示的解决办法
- 触发Full GC执行的情况
- 【HDU 2955】Robberies(DP)
- iOS UITableView(UIScrollView)滑动到底部的判断
- IOS如何替换电话号码中间4位为"-"符号
- Dubbo标签学习