实验7map和stack

文章讲述了ACM-ICPC国际大学生程序设计竞赛的规则,参赛队伍通过解决不同难度的问题获得不同颜色的气球,最多的是最简单的。同时,文章也涉及到了网络系统中用户上网的统计,包括用户数、上网记录和网页浏览情况。最后,提出了一个问题情境,关于如何管理洗盘子的过程,涉及到栈和队列的数据结构应用。
摘要由CSDN通过智能技术生成

1让气球升起

国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛,ACM-ICPC以团队的形式代表各学校参赛,每队由3名队员组成,一个队每做出来一个题该队就会获得该题对应颜色的气球,气球越多就说明该队做的题目越多。当然如果一个颜色的气球越多就说明该气球对应的题也就越简单。现在给你很多很多的颜色的气球,问你那个颜色的气球最多,哈哈,聪明的acmer这题对你肯定很简单吧

假设只有6种颜色,green,red,blue,pink,orange,black。输入数据有多组,每组数据开始给出一个整数n代表接下来有n个气球,接下来有n行,每行输入一种颜色,n <= 100,输入以EOF结束。

输出个数最多的气球的颜色(题目保证个数最多的气球有且仅有一种颜色)

Sample Input

3

green

red

green

5

green

red

blue

red

red

Sample Output

green

red

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n = 0;  string str = "";
    while(cin >> n) {
        map<string,int> hash;
        for(int i = 0; i < n; ++i) {
            cin >> str;
            ++hash[str];
        }
        string ans = "";int cnt = 0;
        for(map<string,int>::iterator it = hash.begin(); it != hash.end(); ++it) {
            if(it -> second > cnt) {
                cnt = it -> second;
                ans = it -> first;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

 

2上网统计

在一个网络系统中有 N 个用户、M 次上网记录。每个用户可以自己注册一个用户名,每个用户名是一个只含小写字母且长度小于 1000 的字符串。每个上网的账号每次上网都会浏览网页,网页名是以一个只含小写字母且长度小于 1000 的字符串,每次上网日志里都会有记录,现在请统计每个用户每次浏览了多少个网页。

单组输入。

第 1 行包含两个用 1 个空格隔开的正整数 N(1≤N≤1000)和 M(1≤M≤5000)。

第 2到M+1 行,每行包含 2 个用 1 个空格隔开的字符串,分别表示用户名和浏览的网页名。

共 N 行,每行的第一个字符串是用户名,接下来的若干字符串是这个用户依次浏览的网页名(之间用一个空格隔开)。按照用户名出现的次序排序输出。

Sample Input

5 7

goodstudyer bookshopa

likespacea spaceweb

goodstudyer bookshopb

likespaceb spaceweb

likespacec spaceweb

likespacea juiceshop

gameplayer gameweb

 

Sample Output

goodstudyer bookshopa bookshopb

likespacea spaceweb juiceshop

likespaceb spaceweb

likespacec spaceweb

gameplayer gameweb

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n = 0, m = 0;   cin >> n >> m;
    map<string,queue<string> > hash;
    vector<string> namevec;
    string name = "", web = "";
    for(int i = 0; i < m; ++i) {
        cin >> name >> web;
        hash[name].push(web);
        if(find(namevec.begin(), namevec.end(), name) == namevec.end())
        namevec.push_back(name);
    }
    for(vector<string>::iterator it = namevec.begin(); it != namevec.end(); ++it) {
        cout << *it << " ";
        while(!hash[*it].empty()) {
            cout << hash[*it].front();
            if(hash[*it].size() != 1)   cout << " ";
            hash[*it].pop();
        }
        cout << endl;
    }
    return 0;
}

 

 

3洗盘子

Bessie 和 Canmuu 将联手洗掉N (1<= N <= 10,000) 个脏盘子。

Bessie 洗; Canmuu 来擦干它们.

每个盘子有一个指定的编号,范围1..N. 开始,所有盘子按顺序排列在栈中,1号盘子在顶端,N号盘子在底端.

Bessie 会先洗一些盘子,然后放在洗过的盘子栈里(这样原来的顺序颠倒).

然后,或者她洗别的盘子,或者Canmuu 擦干她已经洗好的部分或全部盘子,放在擦干的盘子栈里。

这样直到所有盘子洗完擦干后放置的顺序是什么?

Input

第一行: 一个整数N,表示盘子的数量

以下若干行: 每一行两个整数 ,第一整数为1表示洗盘子,为2表示擦盘子,第二个整数表示数量

Output

共N行:擦干后盘子从顶端到底端的顺序

Sample Input

5

1 3

2 2

1 2

2 3

Sample Output

1

4

5

2

3

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n = 0;  cin >> n;
    stack<int> plates;
    stack<int> washed;
    queue<int> ans;
    for(int i = n; i >= 1; --i) plates.push(i);
    int a = 0, b = 0;
    while(cin >> a >> b) {
        if(a == 1)
        for(int i = 0; i < b; ++i) {
        int plate = plates.top();
        plates.pop();
        washed.push(plate);
        }
        else if(a == 2)
        for(int i = 0; i < b; ++i) {
            int plate = washed.top();
            washed.pop();
            ans.push(plate);
        }
    }
    while(!ans.empty()) {
        cout << ans.front() << endl;
        ans.pop();
    }
    return 0;
}

这里的输出是从底端到顶端的顺序,和题意相反了。将ans改成stack,ans.front()改为ans.top()即可

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值