63 lines
1.4 KiB
Markdown
63 lines
1.4 KiB
Markdown
|
# 快速排序的败北
|
|||
|
|
|||
|
## 题目背景
|
|||
|
|
|||
|
小C写出如下快速排序程序:
|
|||
|
```cpp
|
|||
|
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$。
|