1.4 KiB
1.4 KiB
快速排序的败北
题目背景
小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=1000
个 int
范围整数
提示
评分方式
共10个测试点,每个测试点10分。
- 若输入不合法(数字个数少于或者多于 $1000$,格式不对),得
0
分; - 否则
checker
会执行小C的快排程序并计算cnt
的值,若最终cnt>k
则得10分、否则得0分。
对于第 i
个测试点,$k=400\times 2^i$。