zoukankan      html  css  js  c++  java
  • HDU2034 人见人爱A-B

    问题链接HDU2034 人见人爱A-B

    问题简述参见上述链接。

    问题分析这是一个求整数集合差的问题,是基础训练题。解题思路可以参考:HDU1412 {A} + {B}

    平日里,使用C++容器的set类,可是不知道是怎么实现的。做了这两个题起码略知一二。

    求集合的差,算法过程略微复杂一点。

    这里分别给出C和C++程序。用C语言写程序,才能够知道许多功能到底是如何实现的。

    C++中有容器类set,就是集合,用起来方便。因为是求差集,读入的集合{A}数据直接放到一个集合中,读入集合{B}数据后,到集合中找一下该数据,如果在则删除掉即可。

    C语言程序中,用两个数组来存放两个集合。需要注意的是,要根据题意定义数组的大小,以免溢出。要求集合差,需要将两个数组进行归并。所以先分别排序,再归并,这样算法会简单一些。需要说的是,程序中的归并算法只是计算集合差的一种方法。

    程序说明输出时,按照题意,每个元素后带有一个空格,程序处理比较简单。但是,从HDU1412 {A} + {B}CV来的代码就不好用了。

    AC的C++语言程序如下:

    /* HDU2034 人见人爱A-B */
    
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
        int n, m, val;
        set<int> result;
    
        while(cin >> n >> m) {
            if(n == 0 && m == 0)
                break;
    
            result.clear();
    
            // n个元素放进集合中
            for(int i=1; i<=n; i++) {
                cin >> val;
                result.insert(val);
            }
    
            // m个元素,如果在集合中,则删除该元素
            for(int i=1; i<=m; i++) {
                cin >> val;
    
                if(result.find(val) != result.end()) {
                    result.erase(val);
                }
            }
    
            // 打印输出结果
            if(result.size() == 0)
                cout << "NULL" << endl;
            else {
                for(set<int>::iterator it = result.begin(); it != result.end(); it++)
                    cout << *it << " ";
                cout << endl;
            }
        }
    
        return 0;
    }

    AC的C语言程序如下:

    /* HDU2034 人见人爱A-B */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int cmp(const void * a, const void * b)
    {
        return *(int *)a - *(int *)b;
    }
    
    int main(void)
    {
        int n, m, seta[100+1], setb[100+1], i, j, k;
    
        while(scanf("%d%d", &n, &m) != EOF) {
            if(n == 0 && m == 0)
                break;
    
            // 读入集合A,并且排序
            for(i=0; i<n; i++)
                scanf("%d", &seta[i]);
            qsort(seta, n, sizeof(int), cmp);
    
            // 读入集合B,并且排序
            for(i=0; i<m; i++)
                scanf("%d", &setb[i]);
            qsort(setb, m, sizeof(int), cmp);
    
            // 两路归并计算{A}-{B},结果放在集合A中
            i = 0;
            j = 0;
            k = 0;
            for(;;) {
                if(i==n)        // 集合A已经处理完
                    break;
                if(j==m) {      // 集合B已经看完,移动剩下元素
                    for(;;) {
                        if(i==n)
                            break;
                        seta[k++] = seta[i++];
                    }
                }
    
                if(seta[i] == setb[j])      // 剔除seta[i]
                    i++;
                else if(seta[i] < setb[j])  // 保留seta[i]
                    seta[k++] = seta[i++];
                else if(seta[i] > setb[j])  // 跳过setb[i]
                    j++;
            }
    
            // 输出结果({A}-{B})
            if(k == 0)
                printf("NULL
    ");
            else {
                for(i=0; i<k; i++) {
                    printf("%d ", seta[i]);
                }
                printf("
    ");
            }
        }
    
        return 0;
    }


     

  • 相关阅读:
    java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.
    spring-session-data-redis依赖冲突问题
    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod
    图片上传后台服务报内存溢出 Out Of Memory Java heap space
    mysql 数据库密码忘记重置 进行远程连接
    打Jar包
    Type interface com.innovationV2.mapper.UserMapper is not known to the MapperRegistry
    关于java基础类型Integer String的clone()
    clion使用clang编译
    token & refresh token 机制总结
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564711.html
Copyright © 2011-2022 走看看