HDU -- 5071 Chat 超强模拟

本文通过一个具体的程序示例介绍了C++标准模板库(STL)中map和vector的使用方法,包括如何查找元素、插入元素、删除元素等基本操作,并详细解释了一个涉及聊天记录管理的案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接
熟悉map和vector的操作, 特别是map的,vector只是充当一个队列的储存.
//map.count(k); 算出map中有多少个k, 其中k为map的key值.
//一个find Vector的例子(BAIDU里找的),注意find不属于vector的成员,而存在于算法中,应加上头文件#include :

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main( )
{
    vector<int> L;
    L.push_back( 1 );
    L.push_back( 2 );
    L.push_back( 3 );
    L.push_back( 4 );
    L.push_back( 5 );
    vector<int>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3
    if ( result == L.end( ) ) //没找到
        cout << "No" << endl;
    else //找到
        cout << "Yes" << endl;

}

AC Code
//太烦了,调了两小时的BUG, 最后是用了迭代器的问题, 还少打了句号.
//注意几点:最后说Bye时只跟说过话的妹子说. 如果有标记,则先和标记说. 每一步都要去考虑到标记.

/** @Cain*/
const int maxn=1e4+5;
int cas=1;
char s[maxn];
vector<int>ve;
map<int,ll>mp;
void solve()
{
    int n;
    scanf("%d",&n);
    ve.clear();
    mp.clear();
    int flag = -1;
    for(int i=1;i<=n;i++){
        scanf("%s",s);
        int u;
        printf("Operation #%d: ",i);
        if(!strcmp(s,"Add")){
            scanf("%d",&u);
            if(mp.count(u)) printf("same priority.\n");
            else{
                ve.push_back(u);   //推进vector.
                mp[u] = 0;   //放进map.注意此时的mp[u] = 0. 即没有单词.
                printf("success.\n");
            }
        }

        else if(!strcmp(s,"Close")){
            scanf("%d",&u);
            if(mp.count(u)){
                printf("close %d with %lld.\n",u,mp[u]);
                mp.erase( u );  //这种需要想一下.就是如何进行这一步操作更好写.
                ve.erase(find(ve.begin(),ve.end(),u));
            }
            else printf("invalid priority.\n");
        }

        else if(!strcmp(s,"Chat")){
            scanf("%d",&u);
            if(!ve.empty()){
                printf("success.\n");
                if(flag == -1)  //注意判是否有标记.
                    mp[ve[0]] += u;
                else
                    mp[flag] += u;
            }
            else printf("empty.\n");
        }

        else if(!strcmp(s,"Rotate")){
            scanf("%d",&u);
            if(u<0 || u>ve.size()) printf("out of range.\n");
            else{
                printf("success.\n");
                int tmp = ve[u-1];
                ve.erase(ve.begin()+u-1);
                ve.insert(ve.begin(),tmp);
            }
        }

        else if(!strcmp(s, "Prior")) {
            if(ve.empty()) printf("empty.\n");
            else {
                int idx = 0;
                for(int k = 0; k < ve.size(); k++)
                    if(ve[k] > ve[idx]) idx = k;
                //直接暴力循环找出最大值.
                int tmp = ve[idx];
                //注意这些函数的参数都是迭代器,即类似于指针.
                ve.erase(ve.begin() + idx);
                ve.insert(ve.begin(), tmp);
                printf("success.\n");
            }
        }

        else if(!strcmp(s,"Choose")){
            scanf("%d",&u);
            if(mp.count(u)){
                printf("success.\n");
                ve.erase(find(ve.begin(),ve.end(),u));
                ve.insert(ve.begin(),u);
            }
            else printf("invalid priority.\n");
        }

        else if(!strcmp(s,"Top")){
            scanf("%d",&u);
            if(mp.count(u)){
                printf("success.\n");
                flag = u;
            }
            else printf("invalid priority.\n");
        }

        else if(!strcmp(s,"Untop")){
            if(flag == -1) printf("no such person.\n");
            else{
                printf("success.\n");
                flag = -1;
            }
        }
    }
    if(flag != -1){
        if(mp[flag])
            printf("Bye %d: %lld\n",flag,mp[flag]);
        mp[flag] = 0;
    }
    for(int i=0;i<ve.size();i++){
        if(mp[ve[i]]) printf("Bye %d: %d\n",ve[i],mp[ve[i]]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值