k=j;
if(i!
=k)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
intmain()
{
intsort[SIZE];
intnum,i;
while
(1)
{
scanf("%d",&num);
if(num==0)exit(0);
for(i=0;i{
scanf("%d",&sort[i]);
}
fastsort(sort,num);
for(i=0;i{
if(i==num-1)
printf("%d",sort[i]);
else
printf("%d",sort[i]);
}
printf("\n");
}
return0;
}
快速排序版:
#include
#defineSIZE100000
voidquick_sort(inta[],intlow,inthigh)
{
inti,j,t;
if(low{
i=low;
j=high;
t=a[low];
while(i{
while(it)
j--;
if(i{
a[i]=a[j];
i++;
}
while(ii++;
if(i{
a[j]=a[i];
j--;
}
}
a[i]=t;
quick_sort(a,low,i-1);
quick_sort(a,i+1,high);
}
}
intmain()
{
intsort[SIZE];
intnum,i;
while
(1)
{
scanf("%d",&num);
if(num==0)return0;
for(i=0;i{
scanf("%d",&sort[i]);
}
quick_sort(sort,0,num-1);
for(i=0;i{
if(i==num-1)
printf("%d",sort[i]);
else
printf("%d",sort[i]);
}
printf("\n");
}
return0;
}
堆排序版:
#defineMAX10000
#include
voidsift(int*x,intn,ints)
{
intt,k,j;
t=*(x+s);
k=s;
j=2*k+1;
while(j{
if(j{
j++;
}
if(t<*(x+j))
{
*(x+k)=*(x+j);
k=j;
j=2*k+1;
}
else
{
break;
}
}
*(x+k)=t;
}
voidheap_sort(int*x,intn)
{
inti,k,t;
int*p;
for(i=n/2-1;i>=0;i--)
{
sift(x,n,i);
}
for(k=n-1;k>=1;k--)
{
t=*(x+0);
*(x+0)=*(x+k);
*(x+k)=t;
sift(x,k,0);
}
}
intmain()
{
int*p,i,a[MAX],num;
while
(1)
{
p=a;
scanf("%d",&num);
if(num==0)return0;
for(i=0;iscanf("%d",p++);
p=a;
heap_sort(p,num);
for(i=0;i{
if(i==num-1)
printf("%d",a[i]);
else
printf("%d",a[i]);
}
printf("\n");
}
return0;
}
问题B:
整数排序二
时间限制:
20Sec 内存限制:
128MB
题目描述
在完成了任务2的第一个热身题后,很多同学觉得不过瘾,那就用同样的题目让大家再交一次原来已经AC的程序,看是什么样的结果,应该怎样应对?
题目跟第一个热身题是一样的(但我已经大幅增加了测试数据),还是要求将一个杂乱无序的整数序列,按照从小到大的顺序排列并输出.
输入
测试数据不止一组,每组测试数据:
1)先输入无序序列的整数个数n;(n不超过1000000)
2)然后连续输入n个整数;
若n的值输入为0值,则输入结束.
输出
与每组输入的测试数据相对应,输出其按从小到大排好序后的整数序列.
注意:
每组输出占一行.
样例输入
10
987654321-1
5
8877665533
0
样例输出
-1123456789
3355667788
提示
本题测试对第10章“内部排序”的理解程度。
但要考虑算法的优化及排序方法的选择(排序速度要快才行)。
警告:
目的是让大家熟悉内部排序的各种算法,因此禁止调用sort或qsort等函数!
不改正者降最终成绩等级.
#defineMAX1000000
#include
voidsift(int*x,intn,ints)
{
intt,k,j;
t=*(x+s);
k=s;
j=2*k+1;
while(j {
if(j if(t<*(x+j))
{
*(x+k)=*(x+j);
k=j;
j=2*k+1;
}
elsebreak;
}
*(x+k)=t;
}
voidheap_sort(int*x,intn)
{
inti,k,t;
int*p;
for(i=n/2-1;i>=0;i--)
sift(x,n,i);
for(k=n-1;k>=1;k--)
{
t=*(x+0);
*(x+0)=*(x+k);
*(x+k)=t;
sift(x,k,0);
}
}
intmain()
{
int*p,i,a[MAX],num;
while
(1)
{
p=a;
scanf("%d",&num);
if(num==0)return0;
for(i=0;i scanf("%d",p++);
p=a;
heap_sort(p,num);
for(i=0;i {
if(i==num-1)
printf("%d",a[i]);
else
printf("%d",a[i]);
}
printf("\n");
}
return0;
}
问题C:
时间复杂度的估算
时间限制:
1Sec 内存限制:
128MB
题目描述
在数据结构里面,时间复杂度是决定算法效率的一项重要指标,常见的时间复杂度格式有三种:
1、O(n)
2、O(lg(n))
3、O(sqrt(n))
一个算法往往有多种解法,每种解法的复杂度由上述常见的的复杂度组合成,例如排序的两种算法:
1、 快速排序:
时间复杂度为O(n*lg(n))
2、冒泡排序:
时间复杂度为O(n*n)
现在先给定n的值,然后输入一个值m,随后输入m行数据表示有m个算法的复杂度。
请确定这些复杂度是否会超时。
若复杂度计算结果大于100000000,则为超时(TLE),否则输出计算的复杂度,输出的结果保留两位小数。
(lg(n)表示求以2为底数的n的对数 )
输入
第一行输入n(1≤n≤10000000),m(1≤m≤100), 其中n为表示问题规模的数,m为算法复杂度的个数。
接下来m行,每行为一个串,每个串都包含O(),其中,字符'O'后的括号里面的字符串保证仅由n,lg(n),sqrt(n),*组成并且合法。
如sampleinput所示。
注意:
lg()或sqrt()中只会出现字符'n',不会再嵌套lg()或sqrt()。
如果想做得难一点,可以去做编号为1049的题,1049题要考虑嵌套。
输出
对于每个串,若计算出来的复杂度大于100000000,则输出TLE,否则输出该复杂度的计算结果。
样例输入
100005
O(n*n)
O(n*n*n)
O(sqrt(n))
O(lg(n))
O(n*lg(n))
样例输出
100000000.00
TLE
100.00
13.29
132877.12
提示
本题主要测试三个方面:
1)对于时间复杂度的理解。
2)字符串处理及数组的合理使用。
3)编码能力。
#include
#include
#defineMAX100
intmain()
{
intN_NUM,L_NUM,S_NUM;
intnum;
charstring[MAX];
doubles;
inti,p,n;
while(scanf("%d%d",&n,&num)!
=EOF)
{
for(s=1.0,N_NUM=0,L_NUM=0,S_NUM=0,p=0;p {
scanf("%s",string);
s=1.0;
N_NUM=0;
L_NUM=0;
S_NUM=0;
for(i=2;string[i]!
='\0';i++)
{
if(string[i]=='n')
{
N_NUM++;
i++;
}
if(string[i]=='l')
{
L_NUM++;
i=i+5;
}
if(string[i]=='s')
{
S_NUM++;
i=i+7;
}
}
for(i=0;i s=s*n;
for(i=0;i s=s*(log(n)/log(2.0));
for(i=0;i s=s*sqrt(n);
if(s>100000000)
printf("TLE\n");
else
printf("%.2f\n",s);
}
}
}
问题D:
车站调度
时间限制:
1Sec 内存限制:
128MB
题目描述
有顺序排列的1,2,3,…,n节车厢在入站口等待调度。
车站设置了一个栈作为缓冲,这样的话只可能进行下列两个操作之一:
(1)如果还有车厢在入站口,将最前面的入栈缓冲
(2)将栈顶的车厢驶出车站
给定一个1至n的排列,问其作为出站序列是否合法。
注意:
入站顺序为1,2,3,…,n,即1先入栈...,n最后入栈。
输入
输入包含若干测试用例。
每一个测试用例由多行组成。
第一行是两个整数n(1<=n<=100)和m,n表示入站序列为1至n。
m表示随后有m行出站序列。
当n,m均为0时表示输入结束。
输出
对应每一个出站序列,合法则输出一行YES,否则输出一行NO。
样例输入
36
123
132
213
231
312
321
00
样例输出
YES
YES
YES
YES
NO
YES
提示
参见习题集p21题3.1。
本题主要测试对栈的理解及灵活运用。
解本题推荐采用模拟入栈出栈的方式,以训练对栈的运用熟练程度。
当然也有其它方法,如推导出规律(出栈序列中存在“大小中”的组合是不行的)后编程求解。
#include
#defineMAX100
#defineSIZE100
intclear(inta[],intp)
{
inti;
for(i=0;i {
if(a[i] return0;
}
return1;
}
intJudge(inta[],intnum)
{
intjudge[SIZE];
intp;
inti,k,j;
for(i=0;i {
for(k=i+1,p=0;k {
if(a[i]>a[k])
{
judge[p++]=a[k];
}
}
if(clear(judge,p))
continue;
else
{
printf("NO\n");
return-1;
}
}
printf("YES\n");
return0;
}
intmain()
{
intnum,time;
inta[MAX];
inti,j;
while
(1)
{
scanf("%d%d",&num,&time);
if(num==0&&time==0)return0;
for(i=0;i