STL练习

周瑜的反间计

周瑜的反间计终于获得成功。却说这蒋干除了周瑜伪造的信件之外,还偷偷的从周瑜处拿到了许多文件。这些文件有真有假,每个文件都有一独立的编号。现在他想跟已有的文件编号做对比,如果该文件编号存在于已有编号,那么就可判断此文件为真实的。你可以写一个程序帮助蒋干么?

按要求输出即可,主要练习了STL中的map(也可以用set)。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    bool first_mark = false;
    while(cin >> n){
        if(n == -1) return 0;
        map<long long,int> File;
        File.clear();
        
        for(int i = 0;i<n;i++){
            long long x;
            cin >> x;
            File[x] = 1;
        }
        int m;
        cin >> m;
        if(first_mark) cout << endl;
        while(m--){
            long long now;
            cin >> now;
            if(File.count(now)) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
        first_mark = true;
    }
    return 0;
}

Train Problem I

题意是:

新学期伊始,伊格纳蒂乌斯火车站近来格外繁忙。许多学生希望乘火车返校(因为伊格纳蒂乌斯火车站的列车是全世界最快的 ^v^)。但问题随之而来:车站只有一条铁路线供所有列车停靠。因此,所有列车都从同一侧驶入,并从另一侧驶出。在这个问题中,如果列车 A 先进入铁路,随后列车 B 在列车 A 离开前也进入铁路,那么列车 A 必须等到列车 B 离开后才能驶出。下图展示了这一情况。现在你需要解决的问题是:车站最多同时停靠 9 列火车,所有列车均有编号(从 1 到 n),列车按顺序 O1 进站,你的任务是判断列车是否能够按照顺序 O2 出站。

对于每组数据:

分别用两个长度为10的数组来存储进站顺序和出站顺序,读取字符串,分离为数字存进对应数组,用栈(stack)代表车站,定义两个索引(in,out)分别指向入栈元素的车号和出站需要的车号。用bool值 possible 表示是否能够按照顺序 O2 出站。创建字符串容器ops存储"操作序列"

进入while循环:

若入栈的元素(入栈数组[in])等于当前需要的车号,就出栈(站)并将"Out"加到ops里,然后out++。

若入栈的元素(入栈数组[in])不等于当前需要的车号且栈未满(车站没满),就入栈(站)并将"In"加到ops里,然后in++,out不变。

若入栈的元素(入栈数组[in])不等于当前需要的车号但栈已满(车站满了),说明不存在需要的车号(不能出也不能进,说明不可能),结束循环,修改possible为false。

最后判断possible,为true顺序输出ops;为false输出"No."。在外面输出"FINISH"

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    char O1_str[10], O2_str[10];
    
    while(cin >> n){
        cin >> O1_str;  // 进站顺序字符串
        cin >> O2_str;  // 出站顺序字符串
        
        // 将字符转换为数字
        int O1[9], O2[9];
        for(int i = 0; i < n; i++){
            O1[i] = O1_str[i] - '0';
            O2[i] = O2_str[i] - '0';
        }
        
        stack<int> s;       // 车站栈
        vector<string> ops; // 操作序列
        int idx_in = 0;     // O1 的当前进站索引
        int idx_out = 0;    // O2 的当前出站索引
        bool possible = true;
        
        while(idx_out < n){
            // 如果栈顶是需要的车,就出站
            if(!s.empty() && s.top() == O2[idx_out]){
                ops.push_back("out");
                s.pop();
                idx_out++;
            }
            // 否则还有车可以进站,就进站
            else if(idx_in < n){
                s.push(O1[idx_in]);
                ops.push_back("in");
                idx_in++;
            }
            // 既不能出也不能进,说明不可能
            else{
                possible = false;
                break;
            }
        }
        
        if(possible){
            cout << "Yes." << endl;
            for(const string& op : ops){
                cout << op << endl;
            }
        }
        else{
            cout << "No." << endl;
        }
        cout << "FINISH" << endl;
    }
    return 0;
}

2010辽宁省决赛 SPY

  • 有三个列表:

    1. A:将要进入 X 国的所有人。

    2. B:Y 国派来的间谍名单。

    3. C:X 国以前派往 Y 国的间谍名单(C 中的人可能是"双重间谍")。

  • 双重间谍(dual-spy)是既在 B(Y 国派来的)又在 C(X 国以前派往 Y 国的)的人。

  • 指挥官要 抓捕 的是:来自 Y 国的间谍(B 中的人)且不是双重间谍 ,并且这个人 同时也在 A 中(即他会出现在边境)。

  • 输出顺序是 按照 B 名单里的顺序,只输出那些符合上述条件的人。

  • 如果没有人符合,输出 "No enemy spy"

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
    int A,B,C;
    
    while(cin >> A >> B >> C){
        cin.ignore();
        vector<string>a;//入境人员名单
        for(int i = 0;i<A;i++) {
            string name;
            cin >> name;
            a.push_back(name);
        }
        unordered_set<string> set_a(a.begin(),a.end());//转化为哈希表方便查找
        
        vector<string>b;//间谍名单
        for(int i = 0;i<B;i++) {
            string name;
            cin >> name;
            b.push_back(name);
        }
        
        vector<string>c;//我方人员名单
        for(int i = 0;i<C;i++) {
            string name;
            cin >> name;
            c.push_back(name);
        }
        unordered_set<string> set_c(c.begin(),c.end());
        
        bool found = false;
        for(int i = 0;i<b.size();i++){
            if(set_a.count(b[i])){
                if(!set_c.count(b[i])) {cout << b[i] << ' ';found = true;}
            }
        }
        if(!found) cout << "No enemy spy" << endl;
        else cout << endl;
    }
    return 0;
}

Let the Balloon Rise

题目依旧是英文,大意是寻找出现次数最多的颜色,遇到0终止输入。

用map存储颜色与数量的对应关系,for遍历找出最大的。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
     while (cin >> N && N != 0) {
        map<string,int> colorCount;
        string color;
        
        for (int i = 0; i < N; i++) {// 统计每种颜色的数量
            cin >> color;
            colorCount[color]++;
        }
        
        string max;// 找到出现次数最多的颜色
        int maxCount = 0;
        
        for (const auto& now : colorCount) {
            if (now.second > maxCount) {
                maxCount = now.second;
                max = now.first;
            }
        }
        cout << max << endl;// 输出结果
    }
    return 0;
}
相关推荐
Ulyanov2 小时前
Impress.js深度技术解析:架构基础与结构化设计
开发语言·前端·javascript
bybitq2 小时前
cmake构建c++项目时,vscode/cursor无法识别头文件路径,导致报错,解决方案
开发语言·c++·vscode
苦藤新鸡2 小时前
28.两数相加,进位制
数据结构·算法·链表·力扣
充气大锤2 小时前
前端实现流式输出配合katex.js
开发语言·前端·javascript·ai·vue
Lips6112 小时前
第七章 贝叶斯分类器
人工智能·算法·机器学习
无限进步_2 小时前
二叉搜索树(BST)详解:从原理到实现
开发语言·数据结构·c++·ide·后端·github·visual studio
邝邝邝邝丹2 小时前
vue2-computed、JS事件循环、try/catch、响应式依赖追踪知识点整理
开发语言·前端·javascript
郝学胜-神的一滴2 小时前
机器学习特征选择:深入理解移除低方差特征与sklearn的VarianceThreshold
开发语言·人工智能·python·机器学习·概率论·sklearn
多多*2 小时前
计算机网络相关 讲一下rpc与传统http的区别
java·开发语言·网络·jvm·c#