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;
}
相关推荐
艾莉丝努力练剑6 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
YMWM_7 分钟前
python3继承使用
开发语言·python
Once_day22 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~32 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
偷吃的耗子37 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
喜欢喝果茶.41 分钟前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓41 分钟前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)41 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
坚果派·白晓明43 分钟前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库