牛客网编程小结(六)——set

set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。
下厨房
牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。
输入描述:
每个输入包含 1 个测试用例。每个测试用例的第 i 行,表示完成第 i 件料理需要哪些材料,各个材料用空格隔开,输入只包含大写英文字母和空格,输入文件不超过 50 行,每一行不超过 50 个字符。
输出描述:
输出一行一个数字表示完成所有料理需要多少种不同的材料。
输入例子:
BUTTER FLOUR
HONEY FLOUR EGG 
输出例子:
4
例一、
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main()
{
    set<string> mat;
    string str;
    int num=0;
    while(cin>>str)
    {
       if(mat.find(str)==mat.end())
       {
           num++;
           mat.insert(str);
       }      
    }
    cout<<num<<endl;
    return 0;
}
例二、
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main()
{
    set<string> mat;
    string str;
    while(cin>>str)
    {
       mat.insert(str);
    }
    cout<<mat.size()<<endl;
    return 0;
}
木棒拼图
有一个由很多木棒构成的集合,每个木棒有对应的长度,请问能否用集合中的这些木棒以某个顺序首尾相连构成一个面积大于 0 的简单多边形且所有木棒都要用上,简单多边形即不会自交的多边形。
初始集合是空的,有两种操作,要么给集合添加一个长度为 L 的木棒,要么删去集合中已经有的某个木棒。每次操作结束后你都需要告知是否能用集合中的这些木棒构成一个简单多边形。
输入描述:
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n 表示操作的数量(1 ≤ n ≤ 50000) , 接下来有n行,每行第一个整数为操作类型 i (i ∈ {1,2}),第二个整数为一个长度 L(1 ≤ L ≤ 1,000,000,000)。如果 i=1 代表在集合内插入一个长度为 L 的木棒,如果 i=2 代表删去在集合内的一根长度为 L 的木棒。输入数据保证删除时集合中必定存在长度为 L 的木棒,且任意操作后集合都是非空的。
输出描述:
对于每一次操作结束有一次输出,如果集合内的木棒可以构成简单多边形,输出 "Yes" ,否则输出 "No"。
输入例子:
51 11 11 12 11 2
输出例子:
NoNoYesNoNo
判断几条棍子能否组成面积大于 0 的简单多边形只需满足一个条件:
木棍集合中找出一根最长的,记为 max_len ,除了这一根外,剩下的长度之和,记为 Len ,则必须满足 Len > max_len 。 换言之, 设总长度为 sum, 则仅当 sum - max_len > max_len 时,才能组成面积大于0 的简单多边形
#include<iostream>
#include<set>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        multiset<int> s;
        unsigned long long sum=0;
        while(n--)
        {
            int i,l;
            cin>>i>>l;
            if(i==1)
            {
                s.insert(l);
                sum+=l;
            }
            else
            {
                if(s.find(l)!=s.end())
                {
                    s.erase(s.find(l));
                    sum-=l;
                }
            }
            unsigned long long max_len=*(s.rbegin());
            if(max_len<sum-max_len)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值