目录
问题 A: 大顶堆还是小顶堆?
内存限制:128 MB时间限制:1.000 S标准输入输出
题目类型:传统评测方式:文本比较
题目描述
一个CPU处理的任务队列,并不总是按照时间顺序处理,有些任务有着更高的优先级。比如:一个任务需要对核反应堆进行调度,另一个任务是打印一个文档。
针对这种需要处理优先级的任务选择执行场景,需要设计一种数据结构,高效率实现以下两种操作,从集合中定位并删除最大值(执行任务),在集合中插入新元素(新增任务)。堆就是这样一种数据结构。
堆是一种完全二叉树:0号节点为根结点,i号的左子为2*i+1,右子为2*i+2。按照内部元素的大小关系,堆可以分为大顶堆和小顶堆两种。
大顶堆(降序堆):每个结点的值都大于或等于其左右孩子结点的值
小顶堆(升序堆):每个结点的值都小于或等于其左右孩子结点的值
可以用数组去实现堆的存储。
本题给出用数组实现的堆包含的所有元素,请判断其是大顶堆,小顶堆,或者不是堆呢?
输入格式
输入第一行为大于等于2且小于100的一个正整数n,代表数组中元素个数
第二行为空格分割的n个正整数,代表数组中的每个元素
输出格式
输出包括一行
如果是大顶堆,输出Big Heap
如果是小顶堆,输出Small Heap
如果不满足堆堆条件,输出Not Heap
输入样例 复制
6
5 16 30 33 15 38
输出样例 复制
Not Heap
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
int n;
cin>>n;
queue<int>q;
for(int i=0;i<n;i++)
cin>>a[i];
q.push(a[0]);
int da=0;
int xiao=0;
int no=0;
for(int i=1;i<n;i++)
{
q.push(a[i]);
if(i+1==n)
q.push(q.front());
q.push(a[i+1]);
if(q.front()>=a[i]&&q.front()>=a[i+1])
da=1;
else if(q.front()<=a[i]&&q.front()<=a[i+1])
xiao=1;
else
no=1;
q.pop();
i++;
}
if(no)
{
cout<<"Not Heap"<<endl;
return 0;
}
if(da&&!xiao)
{
cout<<"Big Heap"<<endl;
return 0;
}
if(!da&&xiao)
{
cout<<"Small Heap"<<endl;
return 0;
}
if(da&&xiao)
{
cout<<"Not Heap"<<endl;
return 0;
}
}
问题 B: sort by age
内存限制:256 MB时间限制:1.000 S标准输入输出
题目类型:传统评测方式:文本比较
提交:4843通过:1653
题目描述
You are given the ages (in years) of all people of a country with at least 1 year of age. You know that no individual in that country lives for 101 or more years. Now, you are given a very simple task of sorting all the ages in ascending order.
输入格式
There are multiple test cases in the input file. Each case starts with an integer n (0<n<=2000000), the total number of people. In the next line, there are n integers indicating the ages. Input is terminated with a case where n = 0. This case should not be processed.
输出格式
For each case, print a line with n space separated integers. These integers are the ages of that country sorted in ascending order.
输入样例 复制
5
2 1 4 3 6
3
2 1 3
0
输出样例 复制
1 2 3 4 6
1 2 3
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int a[105]={0};
if(n==0)
return 0;
int index;
for(int i=0;i<n;i++)
{
cin>>index;
a[index]++;
}
for(int i=1;i<101;i++)
{
if(a[i]!=0)
{
for(int j=0;j<a[i];j++)
cout<<i<<" ";
}
}
cout<<endl;
}
}
问题 C: 统计字母个数
内存限制:128 MB时间限制:1.000 S标准输入输出
题目类型:传统评测方式:文本比较
提交:2455通过:1262
题目描述
给定一段文章,请输出每个小写字母出现的次数
输入格式
只有一组输入数据,该数据大小<10KB。文章中包含大小写字母、空格和换行符、标点,数字,其他符号等,以’#’结尾。
输出格式
输出格式为“C A”,C为’a’..’z’中的字母,A为出现次数,C和A之间空一格
注意只统计小写字母的数量,忽略其他字符。
输入样例 复制
here is the input
this is the article#
输出样例 复制
a 1
b 0
c 1
d 0
e 5
f 0
g 0
h 4
i 5
j 0
k 0
l 1
m 0
n 1
o 0
p 1
q 0
r 2
s 3
t 5
u 1
v 0
w 0
x 0
y 0
z 0
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll a[30];
int main()
{
char c;
while(cin>>c)
{
if(c=='#')
break;
if(c>='a'&&c<='z')
a[int(c)-97]++;
}
for(int i=0;i<26;i++)
cout<<char(i+97)<<" "<<a[i]<<endl;
}
问题 D: 字母排序
内存限制:128 MB时间限制:2.000 S标准输入输出
题目类型:传统评测方式:文本比较
提交:2116通过:982
题目描述
有一天,老师给小明一个字符串,要求小明把这个字符串从小到大排序,但是小明太懒了,你能帮帮他吗?
输入格式
第一行输入一个整数T,共有T组测试数据(T<=100)。
每组输入数据占一行,为一个仅包含小写字母的字符串(长度<=100000)。
输出格式
输出有T行,每行包括一个排好序的字符串
输入样例 复制
2
abc
acb
输出样例 复制
abc
abc
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
int a[30]={0};
cin>>s;
int n=s.length();
for(int i=0;i<n;i++)
a[int(s[i])-97]++;
for(int i=0;i<26;i++)
{
if(a[i]!=0)
{
for(int j=0;j<a[i];j++)
cout<<char(i+97);
}
}
cout<<endl;
}
}
问题 E: 算法10-6~10-8:快速排序
内存限制:128 MB时间限制:1.000 S标准输入输出
题目类型:传统评测方式:文本比较
提交:3181通过:1676
提交
题目描述
快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别对这两个部分继续进行排序,从而使整个序列有序。
快速排序的算法可以描述如下:
在本题中,读入一串整数,将其使用以上描述的快速排序的方法从小到大排序,并输出。
输入格式
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。 第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出格式
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。 请在每个整数后输出一个空格,并请注意行尾输出换行。
输入样例 复制
10
2 8 4 6 1 10 7 3 5 9
输出样例 复制
1 2 3 4 5 6 7 8 9 10
数据范围与提示
*** 提示已隐藏,点击此处可显示 ***
收起提示[-]
在本题中,需要按照题目描述中的算法完成快速排序的算法。 快速排序是一种十分常用的排序算法,其平均时间复杂度为O(knlnn),其中n为待排序序列中记录的个数,k为常数。大量的实际应用证明,在所有同数量级的此类排序算法中,快速排序的常数因子k是最小的,因此,就平均时间而言,快速排序是目前被认为最好的一种内部排序方法。 而在C语言的常用编译器中,qsort函数是一个非常常用的快速排序函数。
#include<bits/stdc++.h>
using namespace std;
int a[100005];
void qs(int l,int r)
{
if(l<r)
{
int i,j,x;
i=l,j=r,x=a[i];
while(i<j)
{
while(i<j&&a[j]>x)
j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<x)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=x;
qs(l,i-1);
qs(i+1,r);
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
qs(0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}