集合归并
题目描述
给出两个数组,问去重后数的个数,以及两个数组归并后去重数的个数。所谓去重指重复的数删除只剩下一个。
输入
第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;
}
执行结果:
解题思路:
(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;
}