Ural 1082|Gaby Ivanushka|数学推导|快速排序|程序分析
2017-10-06 22:47
218 查看
http://acm.timus.ru/problem.aspx?space=1&num=1082
请你构造一个数列使得程序输出
c=n2+3n−42
由于给定的程序是快速排序,因此我们只关心数列元素之间的大小关系。观察样例输出发现数列是单调增的。因此我们假设严格单调增的数列满足题意。我们构造这样的一个数列,那么执行
c=∑0≤i<n−1P(i,n−1)=∑0≤i<n−1(n−1)−i+2=(n−1)(n+1)−[0+1+⋯+(n−2)]=n2−1−[1+(n−2)](n−2)2=n2+3n−42
所以我们构造一个严格单调递增的数列即可
题目大意
给定以下程序#include <stdio.h> long c; long A ; long P(long l, long r) { long x=A[l], i=l-1, j=r+1, t; while(1) { do{--j; ++c;} while(A[j]>x); do{++i; ++c;} while(A[i]<x); if(i<j) { t=A[i]; A[i]=A[j]; A[j]=t; } else return j; } } void Q(long l, long r) { long n; if(l<r) { n=P(l,r); Q(l,n); Q(n+1,r); } } int main(void) { c=0; for(long i=0; i<N; ++i) scanf("%ld", &A[i]); Q(0,N-1); if(c==(N*N+3*N-4)/2) printf ("Beutiful Vasilisa"); else printf ("Immortal Koshcei"); return 0; }
请你构造一个数列使得程序输出
Beautiful Vasilisa。
输入
一行一个整数n表示数列长度。输出
输出n个整数表示你构造的数列,要求是程序能够输出Beautiful Vasilisa。
样例输入
3
样例输出
3 7 19
题解
发现这个程序就是快速排序给定的数列,然后统计i和j指针的移动次数和c。我们的任务就是构造一个序列使其c=n2+3n−42
由于给定的程序是快速排序,因此我们只关心数列元素之间的大小关系。观察样例输出发现数列是单调增的。因此我们假设严格单调增的数列满足题意。我们构造这样的一个数列,那么执行
P时,我们取的x为数列片段中的最小值,那么i就从L−1走到L,j从R+1走到L,总共移动了R−L+2次。每次Q(L,R)调用完P(L,R)后,会接着调用Q(L,L)和Q(L+1,R),又Q(L,L)=0,所以Q(0,n−1)相当于
c=∑0≤i<n−1P(i,n−1)=∑0≤i<n−1(n−1)−i+2=(n−1)(n+1)−[0+1+⋯+(n−2)]=n2−1−[1+(n−2)](n−2)2=n2+3n−42
所以我们构造一个严格单调递增的数列即可
#include <cstdio> int main() { int n, i; scanf("%d", &n); for (i = 0; i < n; ++i) printf("%d ", i); return 0; }
相关文章推荐
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- URAL 1309 Dispute (数学+推导)
- 快速排序分析总结
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析
- 快速排序的性能分析
- c语言 程序 快速排序
- 快速排序优化分析
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 使用std::sort()排序导致程序core问题分析
- 快速排序的分析及c语言代码
- 快速和选择排序程序示例
- 插入排序 快速排序 分析整理
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
- 算法分析之冒泡,快速,选择排序
- valgrind快速入门——unix下程序创建动态分析工具
- C程序快速排序之qsort()
- MIT:算法导论——4.2快速排序 以及 排序算法时间复杂度分析
- 排序--快速排序--详细分析
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
- LDA-线性判别分析(二)Two-classes 情形的数学推导