zoukankan      html  css  js  c++  java
  • 【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[10];
    int cmp(int a,int b){
        printf("1 %d %d
    ",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("
    ");
        fflush(stdout);
        return 0;
    }

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

    #include<cstdio>
    #include<cstring>
    #define N 10005
    int n;
    int a[N];
    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
    ",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("
    ");
        fflush(stdout);
        return 0;
    }
      
  • 相关阅读:
    Java程序执行超时——Future接口介绍
    JENKINS 打包发布脚本
    获取servletContext springMvc获取servletContext
    14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:
    14.18.1 The InnoDB Recovery Process InnoDB 恢复进程:
    perl 获取文件内容里第一个AAA和最后一个AAA
    14.18 InnoDB Backup and Recovery 备份和恢复:
    职业素养与职业声誉——北漂18年(62)
    Openstack组件实现原理 — Nova 体系结构
    Openstack组件实现原理 — Nova 体系结构
  • 原文地址:https://www.cnblogs.com/flipped/p/5646062.html
Copyright © 2011-2022 走看看