第一周寒假作业,供交流想法。
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;
}
评论