c++ set 容器的经典应用 :例子1:set进行添删改查,例子2:求解不同质因子的个数 ,

Set 的应用 1(noi.openjudge.cn) 平台的提交
3341:Set 
描述
现有一整数集(允许有重复元素),初始为空。我们定义如下操作: 
add x 把 x 加入集合 
del x 把集合中所有与 x 相等的元素删除 
ask x 对集合中元素 x 的情况询问 
对每种操作,我们要求进行如下输出。 
add 输出操作后集合中 x 的个数 
del 输出操作前集合中 x 的个数 
ask 先输出 0 或 1 表示 x 是否曾被加入集合(0 表示不曾加入),再输出当前集
合中 x 的个数,中间用空格格开。 
输入
第一行是一个整数 n,表示命令数。0<=n<=100000。 
后面 n 行命令,如 Description 中所述。 
输出
共 n 行,每行按要求输出。 
样例输入

add 1 
add 1 
ask 1 
ask 2 
del 2 
del 1 
ask 1 
样例输出


1 2 
0 0 


1 0 
 
#include<bits/stdc++.h>
using namespace std;
int main()
{
//freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
multiset<int> s;
multiset<int> s1;// 存备份,只存不删除
int n;
cin>>n;
int i;
for(i=1;i<=n;i++)
{
string str;
int x;
cin>>str>>x;
if(str=="add")
{
s.insert(x);
s1.insert(x);// 备份里面 添加这个 元素
cout<<s.count(x)<<endl;
}
else if(str=="del")
{
cout<<s.count(x)<<endl;
s.erase(x);
}
else if(str=="ask")
{
if(s1.count(x)>0)
cout<<1<<" ";
else
cout<<0<<" ";
cout<<s.count(x)<<endl;
}
}
return 0; 
}

Set 的应用 2
描述
我们定义一个正整数 a 比正整数 b 优先的含义是: 
*a 的质因数数目(不包括自身)比 b 的质因数数目多; 
*当两者质因数数目相等时,数值较大者优先级高。 
 
现在给定一个容器,初始元素数目为 0,之后每次往里面添加 10 个元素,每次
添加之后,要求输出优先级最高与最低的元素,并把该两元素从容器中删除。 
输入
第一行: num (添加元素次数,num <= 30) 
下面 10*num 行,每行一个正整数 n(n < 10000000). 
输出
每次输入 10 个整数后,输出容器中优先级最高与最低的元素,两者用空格间隔。 
样例输入

10 7 66 4 5 30 91 100 8 9 
样例输出
66 5 
/*
#include<bits/stdc++.h>
using namespace std;
int f(int x)
{
if(x<2)
return 0;
int i;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)
return 0;
}
return 1;
}
// x 中不同质因子的个数
int ff(int x)
{
int cnt=0;
if(f(x)==1)
return 0;
int i;
for(i=2;x!=1;i++) // x 在动态调整,x 不是原来的 x,自己除以自己等 1
的时候结束
{
if(x%i==0&&f(i)==1) // 质因子
{
cnt++; // 只加 1 次
while(x%i==0)
{
x=x/i; // 把能够分解的 i 除以完
}
}
}
return cnt;
}
typedef struct node
{
int x; // 数
int cnt; // 因子数量
bool operator<(const node &nd1)const
{
if(cnt!=nd1.cnt)
return nd1.cnt<cnt; // 后者小于前者,从大到小
else
return nd1.x<x; // 第一规则相同的话,按照数的从大到小
}
}node;
node nd[11];
int main()
{
int t;
cin>>t;
set<node> s;
while(t--)
{
int i;
for(i=1;i<=10;i++)
{
int x;
cin>>x;
nd[i].x=x;
nd[i].cnt=ff(x);
s.insert(nd[i]);
}
cout<<(*(s.begin())).x<<" "<<(*(--s.end())).x<<endl;
s.erase(s.begin());// 删掉第一个位置
s.erase(--s.end());// 删掉最后一个元素
}
return 0;
}

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值