bdfz_2024_summer/day3/T433080/T433080.md

1.4 KiB
Raw Permalink Blame History

快速排序的败北

题目背景

小C写出如下快速排序程序

int n, a[1005];
int cnt = 0;
int partition(int l, int r) {
    cnt += r-l+1;
    swap(a[l], a[(l+r)/2]);
    int i = l+1, j = r, x = a[l];
    while(1){
        while(a[i]<x && i<=r) i++;
        while(a[j]>x && j>=l+1) j--;
        if(i>=j) break;
        swap(a[i],a[j]);
        i++;j--;
    }
    swap(a[l],a[j]);
    return j; 
}

void qsort(int l, int r){
    if(l >= r) return;
    int m = partition(l,r);//分
    qsort(l,m-1);//解
    qsort(m+1,r);
}

int main(){
	n = 1000;
   for(int i=1;i<=n;i++) cin>>a[i];
   qsort(1,n);
   return 0;
}

题目描述

你做为出题人想要让小C的快排程序复杂度退化为 $O(n^2)$。

给定整数 $k$,请你构造一组 n=1000 的数据使得小C的程序运行结束时计数器 cnt 的值超过 $k$。

请认真阅读【评分方式】

输入格式

输入1个整数 $k$,代表 cnt 要超过的值

输出格式

输出一行包含 n=1000int 范围整数

提示

评分方式

共10个测试点每个测试点10分。

  • 若输入不合法(数字个数少于或者多于 $1000$,格式不对),得 0 分;
  • 否则 checker 会执行小C的快排程序并计算 cnt 的值,若最终 cnt>k 则得10分、否则得0分。

对于第 i 个测试点,$k=400\times 2^i$。