STL opj 顺序容器题:list,set,冷血格斗场,热血格斗场

5 篇文章 0 订阅
1 篇文章 0 订阅
本文介绍了STL中的list和set容器,特别提到了set和multiset中count(T x)函数的重要性,该函数用于统计容器内元素的数量。文章以‘冷血格斗场’为主题,深入探讨了这两个数据结构的应用。
摘要由CSDN通过智能技术生成

list

#include <cstdio>
#include<iostream>
#include<list>
#include<string>
using namespace std;
/* 
new id ——新建一个指定编号为id的序列(id<10000)
add id num——向编号为id的序列加入整数num
merge id1 id2——合并序列id1和id2中的数,并将id2清空
unique id——去掉序列id中重复的元素
out id ——从小到大输出编号为id的序列中的元素,以空格隔开
*/
int main(){
    list<int> a[10000];
    string s;
    int id,id1,id2;
    int num,cases;
    cin>>cases;
    for(int i=0;i<cases;i++){
        cin>>s;
        if(s=="new"){
            cin>>id;
        }
        else if(s=="add"){
            cin>>id>>num;
            a[id].push_back(num);
        }
        else if(s=="merge"){
            cin>>id1>>id2;
            a[id1].sort();
            a[id2].sort();
            a[id1].merge(a[id2]);
        }
        else if(s=="unique"){
            cin>>id;
            a[id].sort();//!!!!注意去除重复元素前排序,这样才能去除所有重复元素,unique去除的是相邻的重复元素
            a[id].unique();
        }
        else if(s=="out"){
            cin>>id;
            a[id].sort();
            list<int>::iterator it;
            for(it=a[id].begin();it!=a[id].end();it++){
                cout<<*it<<" ";
            }
            cout<<endl;
        }
    }

}
/* 
16
new 1
new 2
add 1 1
add 1 2
add 1 3
add 2 1
add 2 2
add 2 3
add 2 4
out 1
out 2
merge 1 2
out 1
out 2
unique 1
out 1

1 2 3 
1 2 3 4
1 1 2 2 3 3 4

1 2 3 4
*/ 

set

multiset 有count(T x)函数可以计数容器内个数, 请记住这个宝藏函数。。。

#include <iostream>
#include<set>
#include <string>
using namespace std;
int main(){
    string command;
    set <int> a;
    int x,n;
    multiset <int> b;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>command;
        if(command=="add"){
            cin>>x;
            a.insert(x);
            b.insert(x);
            cout<<b.count(x)<<endl;
        }
        else if(command=="del"){
            cin>>x;
            cout<<b.count(x)<<endl;
            b.erase(x);
        }
        else if(command=="ask"){
            cin>>x;
            cout<<a.count(x)<<" "<<b.count(x)<<endl;
        }
    }
}

冷血格斗场

#include <iostream>
#include<map>
#include <string>
using namespace std;
/*    为了迎接08年的奥运会,让大家更加了解各种格斗运动,facer新开了一家热血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。

    我们假设格斗的实力可以用一个正整数表示,成为实力值。另外,每个人都有一个唯一的id,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的
    实力值之差的绝对值越小越好,如果有两个人的实力值与他差别相同,则他会选择比他弱的那个(显然,虐人必被虐好)。

    不幸的是,Facer一不小心把比赛记录弄丢了,但是他还保留着会员的注册记录。现在请你帮facer恢复比赛纪录,按照时间顺序依次输出每场比赛双方的id。
输入

    第一行一个数n(0 < n <=100000),表示格斗场新来的会员数(不包括facer)。以后n行每一行两个数,按照入会的时间给出会员的id和实力值。一开始,facer就算是会员,id为1,实力值
    1000000000。输入保证两人的实力值不同。
输出

    N行,每行两个数,为每场比赛双方的id,新手的id写在前面。 */
int main(){
    int n;
    int id,power;
    map<int,int> ma;
    ma.insert(make_pair(1000000000,1));
    typedef map<int,int> mm;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>id>>power;
        map<int,int>::iterator it1=ma.begin();;
        map<int,int>::iterator it2=ma.end();
        it2--;
        pair<mm::iterator,mm::iterator> it3=ma.equal_range(power);
        it3.first--;
        if(power<it1->first){
            cout<<id<<" "<<it1->second<<endl;
        }
        else if(power>it2->first){
            cout<<id<<" "<<it2->second<<endl;
        }
        else{
            int former=power- it3.first->first;
            int latter=it3.second->first-power;
            if(former<=latter){
                cout<<id<<" "<<it3.first->second<<endl;
            }
            else{
                cout<<id<<" "<<it3.second->second<<endl;
            }
        }
        ma.insert(make_pair(power,id));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值