算法与竞赛(第4章) - C++与算法基础三

第1关:序列合并

 

//
//  code.cpp
//  step1
//
//  Created by ljpc on 2018/7/17.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "code.h"

int* Merge_Array(int *arr1, int n1, int *arr2, int n2)
// 函数功能:合并两个数组arr1和arr2,完成升序排序,返回排序后的合并数组
// 参数介绍:arr1数组一的首地址,n1数组一的个数,arr2数组二的首地址,n2数组二的个数
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    sort(arr1, arr1 + n1);
    sort(arr2, arr2 + n2);
    static int arr3[10000];
    merge(arr1, arr1 + n1, arr2, arr2 + n2, arr3);
    return arr3;
    /********** End **********/
}

第2关:序列包含

//
//  code.cpp
//  step2
//
//  Created by ljpc on 2018/7/17.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "code.h"

bool Include_Array(int *arr1, int n1, int *arr2, int n2)
// 函数功能:输入两个升序数组,判断数组arr2是否被包含在数组arr1中(arr2不要求连续,但顺序不能乱)
// 参数介绍:arr1数组一的首地址,n1数组一的个数,arr2数组二的首地址,n2数组二的个数
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    bool judge = includes(arr1, arr1 + n1, arr2,arr2 + n2);
    return judge;
    /********** End **********/
}

 第3关:集合并与交

//
//  code.cpp
//  step3
//
//  Created by ljpc on 2018/7/17.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "code.h"

int Set_Union(int *arr1, int n1, int *arr2, int n2, int *arr3)
// 函数功能:给定两个数组arr1和arr2,计算他们的并集,然后存在数组arr3中,并返回并集大小
// 参数介绍:arr1数组一的首地址,n1数组一的个数,arr2数组二的首地址,n2数组二的个数,数组arr3
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    sort(arr1, arr1 + n1);
    sort(arr2, arr2 + n2);
    int n = set_union(arr1, arr1 + n1, arr2, arr2 + n2, arr3) - arr3;
    return n;
    /********** End **********/
}


int Set_Intersection(int *arr1, int n1, int *arr2, int n2, int *arr3)
// 函数功能:给定两个数组arr1和arr2,计算他们的交集,然后存在数组arr3中,并返回交集大小
// 参数介绍:arr1数组一的首地址,n1数组一的个数,arr2数组二的首地址,n2数组二的个数,数组arr3
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    sort(arr1, arr1 + n1);
    sort(arr2, arr2 + n2);
    int n = set_intersection(arr1, arr1 + n1, arr2, arr2 + n2,arr3) - arr3;
    return n;
    /********** End **********/
}

 第4关:集合“差集”与“对称差集”

//
//  code.cpp
//  step4
//
//  Created by ljpc on 2018/7/17.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "code.h"

int Set_Difference(int *arr1, int n1, int *arr2, int n2, int *arr3)
// 函数功能:给定两个数组arr1和arr2,计算arr1-arr2的差集,然后存在数组arr3中,并返回差集大小
// 参数介绍:arr1数组一的首地址,n1数组一的个数,arr2数组二的首地址,n2数组二的个数,数组arr3
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    sort (arr1, arr1 + n1);
    sort (arr2, arr2 + n2);
    int n = set_difference(arr1, arr1 + n1, arr2, arr2 + n2, arr3) - arr3;
    return n;

    /********** End **********/
}


int Set_Symmetric_Difference(int *arr1, int n1, int *arr2, int n2, int *arr3)
// 函数功能:给定两个数组arr1和arr2,计算(arr1-arr2)U(arr2-arr1),然后存在数组arr3中,最后数组大小
// 参数介绍:arr1数组一的首地址,n1数组一的个数,arr2数组二的首地址,n2数组二的个数,数组arr3
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    sort (arr1, arr1 + n1);
    sort (arr2, arr2 + n2);
    int n = set_symmetric_difference(arr1, arr1 + n1, arr2, arr2 + n2, arr3) - arr3;
    return n;

    /********** End **********/
}

 第5关:序列排列问题

//
//  code.cpp
//  step5
//
//  Created by ljpc on 2018/7/18.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "code.h"

void Next_Permutation(int *arr, int n, int m)
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int a=1;
    do{
        for(int i=0;i<n;i++){
            if(i==n-1)cout<<arr[i];
            else cout<<arr[i]<<" ";
        }
        cout<<endl;
        a++;
        if(a==m+1)break;
    }while(next_permutation(arr,arr+n));
    /********** End **********/
}

void Prev_Permutation(int *arr, int n, int m)
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int a=1;
    do{
        for(int i=0;i<n;i++){
            if(i==n-1)cout<<arr[i];
            else cout<<arr[i]<<" ";
        }
        cout<<endl;
        a++;
        if(a==m+1)break;
    }while(prev_permutation(arr,arr+n));
 
    /********** End **********/
}

 

算法竞赛(第6) - c 与stl基础二:栈stack与前中后缀表达式的应用 在竞赛中,算法和数据结构是非常重要的。栈(stack)是一种常用的数据结构,具有先进后出(LIFO)的特性,它在解决一些问题时具有很大的帮助。 栈在数学表达式计算中有广泛的应用。一个常见的应用是将中缀表达式转换为后缀表达式,这样可以更方便地进行计算。中缀表达式是我们通常使用的表达式形式,例如 2 + 3 * 4。而后缀表达式是一种更加简洁的表达式形式,例如 2 3 4 * +。 转换过程中,我们使用到了栈。我们按照运算符的优先级依次扫描中缀表达式的每个元素,如果是操作数,就直接输出到后缀表达式中;如果是运算符,则将其与栈顶元素进行比较,如果优先级大于等于栈顶元素,则将其入栈,否则将栈顶元素出栈并输出到后缀表达式中,然后再将当前运算符入栈。最后,将栈中剩余的运算符依次出栈并输出到后缀表达式中。 转换完成后,我们可以使用栈来计算后缀表达式。遍历后缀表达式的每个元素,如果是操作数,则将其入栈;如果是运算符,则将栈顶的两个元素出栈并进行相应的运算,然后将结果入栈。最后,栈中的元素即为计算后的结果。 除了中缀转后缀表达式之外,栈还有其他的应用。例如,我们可以使用栈判断一个括号序列是否合法。当遇到左括号时,就将其入栈,当遇到右括号时,就将其与栈顶的元素进行匹配,如果匹配成功,则将栈顶元素出栈,否则,表示括号序列不合法。 总的来说,栈是一个非常常用的数据结构,有广泛的应用。在竞赛中,熟练掌握栈的方法和技巧,能够帮助我们更好地解决一些问题,提高编程的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值