第一周寒假作业,供交流想法。

A题:

简单题目,按描述用双端队列存储内存内容。在到达m前只存,到达m后边存边删。

代码如下:

#include <bits/stdc++.h>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n, m; std::cin >> m >> n;

    std::vector<int> art(n, 0);
    for(auto& i : art) std::cin >> i;

    std::vector<int> memb;

    int ans = 0;

    for(int i = 0;i < n;i++){
        bool isFind = false;

        for(int j = 0;j < memb.size();j++){
            if(memb[j] == art[i]){
                isFind = true;
                break;
            }
        }

        if(!isFind){
            if(memb.size() == m) memb.erase(memb.begin());

            memb.push_back(art[i]);
            ans++;
        }
    }

    std::cout << ans;
    return 0;
}

B题:

看到题目,第一反应就是map来映射城市与州的关系,用两个映射来完成查询操作。

先构建映射,然后按州遍历城市列表。查询每个列表中的城市对应前缀的州下的列表,遍历列表看前缀是否为当前州,符合要求关系统计答案即可。

注意由于对称性所以一个对应关系会被统计两次,故统计的一半就是答案。

#include <bits/stdc++.h>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n; std::cin >> n;

    std::map<std::string, std::string> cts;
    std::map<std::string, std::vector<std::string>> stc;

    int ans = 0;

    for(int i = 0;i < n;i++){
        std::string u, v; std::cin >> u >> v;

        cts[u] = v;
        stc[v].push_back(u);
    }

    for(const auto& [v, u] : stc){
        for(const std::string& uu : u){
            std::string pre = uu.substr(0, 2);

            if(stc.count(pre) && pre != v){
                for(const std::string& ou : stc[pre]){
                    if(ou.substr(0, 2) == v) ans++;
                }
            }
        }
    }

    std::cout << ans / 2;
    return 0;
}