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

按要求输出即可,主要练习了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
-
有三个列表:
-
A:将要进入 X 国的所有人。
-
B:Y 国派来的间谍名单。
-
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;
}