求几道Noip级别的“经典”题目(最好带有解析和伪代码或者标程,要详细点的)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求几道Noip级别的“经典”题目(最好带有解析和伪代码或者标程,要详细点的)相关的知识,希望对你有一定的参考价值。

最好是动态规划和图论的经典题,拜谢!有很猛的追加……

动态规划:
数字三角形
最长不下降(公共子)序列
邮票面值设计
马棚问题
方格取数(或者是传纸条)
加分二叉树
选课
(解析标程自己找吧,网上遍地都是)
图论:
(最短)路径(包括dij,floyd,bellman,spfa):Car的旅行路线
最小生成树(prim,kruskal):Agri-Net
强连通分量:想不起来了……
欧拉回路:Riding The Fences

啊,打字真的很费劲。。。题目绝对经典
参考技术A 你可以看看我的文库,我上传了一份noip复习资料,里头有包括最短路,最小生成树等图论的程序,还有0-1背包问题、可重复背包问题,N皇后等动态规划的问题,还有高精度,排序之类。非常全面,我已经上传了,但不知道什么时候通过,你可以去看看,或我发你一份
……嗯,我看了你的资料,我发到你的QQ邮箱上去了。本回答被提问者采纳
参考技术B 赏分很诱人,但是你的要求太高了,而且我连noip是什么都不知道,更别说给你回答了

几道经典动态内存分配笔试题!楼下大爷做完直呼就这?(题目+答案+详解)C语言

📌 本文作者: Foxny

📃 更新记录: 2021.8.8

❌ 勘误记录: 无

💬 参考资料: 高质量的C++/C编程指南、比特科技、Nice笔试题

📜 本文声明: 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

 

 (共4道大题,每题25分。满分100分)

📚 选自高质量的C++/C编程指南、Nice2016校招笔试题

🚪 传送门:【维生素C语言】动态内存管理  (相关知识点复习)


第一题:

💬 下列代码存在什么问题?请指出问题并做出相应的修改。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void GetMemory(char *p) {
    p = (char*)malloc(100);
}

void Test() {
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}

int main() {
    Test();
    
    return 0;
}

💡 参考答案:str 传给 GetMemory 函数时为值传递,所以 GetMemory 函数的形参 p str 的一份临时拷贝。在 GetMemory 函数内部动态开辟的内存空间的地址存放在了 p 中,并不会影响 str。所以当 GetMemory 函数返回之后, str 仍然是 NULL,导致 strcpy 拷贝失败。其次,随着 GetMemory 函数的返回,形参 p 随即销毁并且没有及时的使用 free 释放,从而导致动态开辟的100个字节存在内存泄露问题。根据经验,程序会出现卡死的问题。

🔑 详细解析:

⚡ 代码修改:

① 返回 p ,让 str 接收:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// ↓ 修改返回类型为char*
char* GetMemory(char *p) {
    p = (char*)malloc(100);
    return p; // 将p带回来
}

void Test() {
    char *str = NULL;
    str = GetMemory(str); // 用str接收,此时str指向刚才开辟的空间
    strcpy(str, "hello world"); // 此时copy就没有问题了
    printf(str);
    // 用完之后记得free,就可以解决内存泄露问题
    free(str);
    str = NULL; // 还要将str置为空指针
}

int main() {
    Test();

    return 0;
}

🚩  hello world

② 将值传递改为址传递:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//              ↓ 用char**接收
void GetMemory(char** p) {
    *p = (char*)malloc(100);
}

void Test() {
    char *str = NULL;
    GetMemory(&str); // 址传递,就可以得到地址
    strcpy(str, "hello world");
    printf(str);
    // 记得free,就可以解决内存泄露问题
    free(str);
    str = NULL; // 还要将str置为空指针
}

int main() {
    Test();

    return 0;
}

🚩   hello world


第二题:

💬 下列代码存在什么问题?

#include <stdio.h>
#include <stdlib.h>

char* GetMemory(void) {
    char p[] = "hello world";
    return p;
}

void Test(void) {
    char *str = NULL;
    str = GetMemory();
    printf(str);
}

int main() {
    Test();

    return 0;
}

💡 参考答案:GetMemory 函数内部创建的数组实在栈区上创建的,出了函数 p 数组的空间就还给了操作系统,返回的地址是没有实际意义的,如果通过返回的地址去访问内存,就会导致非法访问内存问题。

🔑 详细解析:


 第三题:

💬 下列代码存在什么问题?请指出问题并做出相应的修改。

#include <stdio.h>
#include <stdlib.h>

void GetMemory(char **p, int num) {
    *p = (char *)malloc(num);
}

void Test(void) {
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
}

int main() {
    Test();

    return 0;
}

💡 参考答案:没有 free,导致内存泄露。

🔑 详细解析:

⚡ 代码修改:

#include <stdio.h>
#include <stdlib.h>

void GetMemory(char **p, int num) {
    *p = (char *)malloc(num);
}

void Test(void) {
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
    
    // 释放并置空
    free(str);
    str = NULL;
}

int main() {
    Test();

    return 0;
}


第四题:

💬 下列代码存在什么问题?请指出问题并做出相应的修改。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Test(void) {
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str);
    
    if(str != NULL) {
        strcpy(str, "world");
        printf(str);
    }
}

int main() {
    Test();

    return 0;
}

💡 本题答案:free 之后没有将 str 置为空指针,导致 if 为真,对已经释放掉的内存进行了访问,引发非法访问的问题。

🔑 详细解析:

⚡ 代码修改:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Test(void) {
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str);
    str = NULL; // 置空
    
    if(str != NULL) {
        strcpy(str, "world");
        printf(str);
    }
}

int main() {
    Test();

    return 0;
}


本章完

以上是关于求几道Noip级别的“经典”题目(最好带有解析和伪代码或者标程,要详细点的)的主要内容,如果未能解决你的问题,请参考以下文章

求几首好听的英文歌

二分查找及对应的几道经典题目

算法如果链表里有随机指针怎么拷贝?-复制带有随机指针的链表-力扣经典题目讲解带图保姆级别教程

noip2017颓废记

初学C++求几个适合新手的OJ刷题网站

几道经典动态内存分配笔试题!楼下大爷做完直呼就这?(题目+答案+详解)C语言