关于#set#集合归并,如何解决?(语言-c++)

集合归并
题目描述
给出两个数组,问去重后数的个数,以及两个数组归并后去重数的个数。所谓去重指重复的数删除只剩下一个。
输入
第1行,整数n,表示第一个数组元素的个数。
第2行,n个整数ai,表示第一个数组的元素。
第3行,整数m,表示第二个数组元素的个数。
第4行,m个整数bi,表示第二个数组的元素。
输出
三行,每行一个整数。
分别表示第一个数组、第二个数组、合并后的数组分别去重后元素的个数。
样例
输入
3
1 2 2
4
2 3 3 4
输出
2
3
4

#include <bits/stdc++.h>
using namespace std;
int main()
{   
    multiset<int> mset;
    set<int> mm;
    char commend[5];
    int i,n,num,amount;
    multiset<int>::iterator it;
    cin >> n;
    for (i=0; i<n; i++)
    {
        cin >> commend >> num;
        switch(commend[1])
        {
        case 'd': 
            mset.insert(num);
            mm.insert(num);
            cout << mset.count(num) << endl;
            break;                
        case 'e': 
            cout << mset.count(num) << endl;
            mset.erase(num);
            break;
        case 's': 
            if (mm.find(num)==mm.end())
                cout << "0 0" << endl;
            else
            {
                cout << "1 ";
                cout << mset.count(num) << endl;
            }
            break;
        }
    }
    return 0;
}


有那个这个改一下

你这个程序不是完成这个功能的呢,switch(commend[1]) 有 d e s
重新写了一个程序供参考:

#include <stdio.h>

int main() {
    int n, m;
    scanf("%d", &n);  // 第一个数组元素个数
    int arr1[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr1[i]);  // 读取第一个数组元素
    }

    scanf("%d", &m);  // 第二个数组元素个数
    int arr2[m];
    for (int i = 0; i < m; i++) {
        scanf("%d", &arr2[i]);  // 读取第二个数组元素
    }

    // 去重计数
    int count1 = 1;  // 第一个数组去重计数,初始为1
    int count2 = 1;  // 第二个数组去重计数,初始为1
    // 去重
    int distinct[n + m];  // 去重后的数组
    int distinctCount = 1;  // 去重计数,初始为1
    distinct[0] = arr1[0];

    // 第一个数组去重
    for (int i = 1; i < n; i++) {
        int duplicate = 0;  // 是否是重复元素的标志
        for (int j = 0; j < distinctCount; j++) {
            if (arr1[i] == distinct[j]) {
                duplicate = 1;
                break;
            }
        }
        if (!duplicate) {
            distinct[distinctCount++] = arr1[i];
            count1++;
        }
    }

    // 第二个数组去重、归并
    for (int i = 1; i < m; i++) {
        int duplicate1 = 0;  // 数组内是否是重复元素的标志
        for (int j = 0; j < i; j++) {
            if (arr2[i] == arr2[j]) {
                duplicate1 = 1;
                break;
            }
        }
        if (!duplicate1) {
            count2++;
        }

        int duplicate2 = 0;  // 归并后是否是重复元素的标志
        for (int j = 0; j < distinctCount; j++) {
            if (arr2[i] == distinct[j]) {
                duplicate2 = 1;
                break;
            }
        }
        if (!duplicate2) {
            distinct[distinctCount++] = arr2[i];
        }
    }

    // 这里输出归并去重后的数组,题不要求输出,注释掉
    /*for (int i = 0; i < distinctCount; ++i) {
        printf("%d ", distinct[i]);
        printf("\n");
    }*/

    printf("%d\n%d\n%d\n", count1, count2, distinctCount);

    return 0;
}

执行结果:

img

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1064304
  • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 5、汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,每次移动一个圆盘,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,柱子可以编号为A B C,编程输出n个圆盘从A柱子移动到C柱子的步骤。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 汉诺塔游戏:把所有盘子从A移动到C

    解题思路:
    (1)把A柱子上的前N-1个盘子借助C柱子,全部移动到B柱子上(过程暂不考虑),再把第N个盘子由A柱子移动到C柱子上,那么剩下要移动的盘子在B柱子上了。
    (2)把B柱子上的前N-2个盘子借助C柱子,全部移动到A柱子上(过程暂不考虑),再把第N-1个盘子由B柱子移动到C柱子上。
    (3)重复上面的两个步骤即可把A柱子上的盘子全部移动到C柱子上。

    #include <stdio.h>
    void loveyou(int n, char start, char help, char end)
    {
    	if (n >= 2)
    	{
    		loveyou(n - 1, start, end, help);
    		printf("%c------>%c\n", start, end);
    		loveyou(n - 1, help, start, end);
    	}
    	else if (n == 1)
    	{
    		printf("%c------>%c\n", start, end);
    	}
    }
    int main(void)
    {
    	int n = 0;
    	printf("输入圆盘的数量:");
    	scanf("%d", &n);
    	loveyou(n, 'A', 'B', 'C');
    	return 0;
    }