前言:
不知为何我的比赛报告页为空白,这此题解有的题就不贴代码了。
1.非降序数组
写一个函数,传入两个非降序的整数数组(A, B),将 A, B 合并成一个非降序数组 C,返回 C(不要使用内置 sort 函数)。
分析
虽然题目写不用sort,但我直接用过了,然后…
首先,这题数据量较大,只能用
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)的排序算法,如:
快速排序
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
归并排序
void merge(int low,int mid,int high)
{
int i=low,j=mid+1,k=low;
while (i<=mid && j<=high)
{
if (a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while (i<=mid)
b[k++]=a[i++];
while (j<=high)
b[k++]=a[j++];
for (int i=low;i<=high;i++)
a[i]=b[i];
}
void mergesort(int x,int y)
{
if (x>=y) return;
int mid=(x+y)/2;
mergesort(x,mid);
mergesort(mid+1,y);
merge(x,mid,y);
}
2.吃!吃!吃!
已知n个整数。 每3个数算一个周期。 不足一个周期补0. 在周期的第一个位置的数的权值和等于a1+a[1+3]+… … 第二个位置的数的权值和等于a2+a[2+3]+… … 求三个数的最大权值。
如果最大权值为第一个数,输出’J’; 最大权值为第二个数,输出’H’; 最大权值为第三个数,输出’B’。
分析
其实就是按下标模3分类,分别求和比较即可。
3.计算逆波兰表达式的结果
逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。
使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) -”;后者写做“3 4 - 5 *”。
分析
其实就是求后缀表达式的值,用栈实现,我以前专门写过一篇文章介绍这个,供参考。
备战NOI 数据结构——栈与单调栈(stack) 以及后缀表达式
4.会议安排
开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的!(老大可能坐在桌子上边) 小艺被分配到排桌椅的活,
可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。 她决定用现有的布局当作是会议座位安排。 每个桌子分配一个人。互相连接相同字符表示一个桌子,如UVV表示2张桌子,UVU则表示3张桌子。 小艺想知道选择某个桌子之后老大身边能围多少人?
分析
简单的搜索,以老大桌子为起点,上下左右四个方向搜,用map记录搜过的桌子,累加答案即可。