首页 > 其他 > 详细

【题目自解】北京大学2016计算机学科夏令营上机考试

时间:2019-07-01 00:43:40      阅读:122      评论:0      收藏:0      [点我收藏+]

【题目自解】北京大学2016计算机学科夏令营上机考试

A:分段函数(NOI 1.4编程基础之逻辑表达式与条件分支)

解题思路

这题就像逗我玩似的,这连简单题都算不上。

AC代码

#include<cstdio>

using namespace std;

int main()
{
    double x, y;
    scanf("%lf", &x);
    if (x >= 0 && x < 5)y = 2.5 - x;
    else if (x >= 5 && x < 10)y = 2 - 1.5*(x - 3)*(x - 3);
    else if (x >= 10 && x < 20)y = x / 2 - 1.5;
    printf("%.3lf", y);
    return 0;
}

B:单词翻转(NOI 1.7编程基础之字符串)

解题思路

简单题,读取一整行用C的gets()函数,VS2017没有这个函数,Dev和OJ可以过。

AC代码

#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    char s[505];
    gets(s);
    int len = strlen(s);
    for (int i = 0; i < len; i++)
    {
        if (s[i] ==  )printf(" ");
        if (s[i] == _)continue;
        else
        {
            int wlen = 0;
            int tmp = i;
            while (s[tmp] !=  )
            {
                wlen++; tmp++;
                if (tmp >= len) break;
            }
            for (int j = i + wlen - 1; j >= i; j--)
            {
                printf("%c", s[j]);
                s[j] = _;
            }
        }
    }
    return 0;
}

C:反反复复(NOI  1.8编程基础之多维数组)

解题思路

简单题,最基础的二维数组。

AC代码

#include<cstdio>
#include<cstring>
int N[205][205];

int main()
{
    int m, n;//列和行 
    char s[205];
    scanf("%d", &m);
    scanf("%s", s);
    int len = strlen(s);
    n = len / m;
    int cnt = 1;
    for (int i = 0; i < n; i++)//按行读入 
    {
        if (cnt % 2)//奇数行正向读入
        {
            for (int j = 0; j < m; j++)N[i][j] = s[i*m + j];
            cnt++;
        }
        else//偶数行反向读入
        {
            for (int j = m - 1; j >= 0; j--)N[i][m - 1 - j] = s[i*m + j];
            cnt++;
        }
    }
    for (int j = 0; j < m; j++)//按列输出 
    {
        for (int i = 0; i < n; i++)printf("%c", N[i][j]);
    }
    return 0;
}

G:重建二叉树

解题思路

详细讲解见二叉树专题。核心思想其实很简单,用数组就可以直接做,无非就是根据前序遍历的结果对中序遍历左右子串分别递归,最后后序打印根节点的值。

AC代码

#include<cstdio>
#include<cstring>
char s1[10000];//存储前序
char s2[10000];//存储中序

void f(int l, int l2, int r2)//总是需要前序遍历的起点和中序遍历的两端,以确定根结点和左右子树
{
    if (l2 == r2)return;//没有元素了
    char r = s1[l];//根结点
    int loc = l2;
    while (s2[loc] != r)loc++;//找到根结点在中序遍历中的位置
    f(l + 1, l2, loc);
    f(l + loc + 1 - l2, loc + 1, r2);//画一画情况就知道了
    printf("%c", r);
}

int main()
{
    while (scanf("%s%s", s1, s2) != EOF)
    {
        int len = strlen(s1);
        f(0, 0, len);
        printf("\n");
    }
    return 0;
}

H:丛林中的路

解题思路

 

AC代码

 

【题目自解】北京大学2016计算机学科夏令营上机考试

原文:https://www.cnblogs.com/yun-an/p/11111865.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!