A. Surrender to My Will(模拟)

时间复杂度:$O(|S|)$

题意

    游戏有投降机制,一共有5个人,当投降赞成人数高于4票及以上时视为投降成功,反之则失败。现在给定一个长度为 $5$ 的字符串,字符种类有 $3$ 种类型:$’Y’$(赞成) $ ‘N’$(反对) $’-‘$(尚未投票),请问最终的结果是什么?如果是赞成,则输出” $1$ “,反对则输出” $-1$ “,如不能确定答案,则输出 “ $0$ ” .

数据范围

  • $S_i \in \{ ’Y’ , ’N’ , ’-’ \}$

思路

    简单模拟题,当 $’Y’$ 的数量不小于 $4$ ,则结果一定赞成;当 $’N’$ 的数量不小于 $2$ ,则结果一定反对;剩下的情况显然不能确定答案 .

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
#define endl '\n'
using i64 = long long;
using namespace std;
signed main(){
std::ios::sync_with_stdio(false);cin.tie(0);
string str;
cin >> str;
int cntY = 0, cntN = 0;
for (int i = 0; i < str.size();i++)
if(str[i]=='Y')
cntY++;
else if(str[i]=='N')
cntN++;
if(cntY>=4)
cout << "1" << endl;
else if(cntN>=2)
cout << "-1" << endl;
else
cout << "0" << endl;
return 0;
}

B. std::pair (模拟)

题意

    给定 $n$ 条关于 $int$ 或 $double$ 以及嵌套 $pair$ 的变量声明,再给定 $m$ 次查询,输出每次询问结果的数据类型 .

数据范围

  • $ 1 \le n,q \le 1000$
  • $|S| \le 5000$

思路

    比较复杂的模拟题,需要整合并处理各个信息和细节。

  1. 对于变量声明,必须采用含空格的字符串输入( getline(cin ,s) )的形式,再准确地统计其姓名,可用$map$ 容器映射变量和下标编号
  2. 在询问的时候,需要记录每个变量所带的 $.first$ 和 $.second$ 的先后顺序,存入一个新的字符串
  3. 最重要的一步检索操作,映射到相应的字符串后,以 “pair< pair < int , double > , pair < int , int > >” 为例,当我们查找$.first$ 或 $.second$ ,只需要以最中心的逗号为分割符, 顾名思义,前半部分为$.first$ ,后半部分为 $.second$
  4. 问题转化为如何查找中间的逗号:通过观察易得,$’<’$ 和 $’>’$ 可以模拟括号的匹配,遍历字符串,如果搜到$’>’$ 则可以抵消前面的一个的$’<’$ ;当搜到逗号且此时前面只有一个未匹配的 $’<’$ 时,该逗号一定为最中心的逗号。显然,括号的匹配过程可以用”栈”实现
  5. 最终遍历步骤2中关于顺序的字符串,每次通过变量类型的字符串截取当前$.first$ 或$.second$ 对应的字符串部分,不断缩小范围,直至关于顺序的字符串遍历完毕,输出结果 .

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<bits/stdc++.h>
#define endl '\n'
using i64 = long long;
using namespace std;
signed main(){
//std::ios::sync_with_stdio(false);cin.tie(0);
int n, m;
cin >> n >> m;
getchar();
vector<string> str(n + 1);
map<string, int> idx; // 变量 -> 编号
for (int i = 1; i <= n;i++){
getline(cin, str[i]);
int num = str[i].size();
string name = "";
for (int j = num - 2; j >= 0;j--){
if(str[i][j]==' ')
break;
name = str[i][j] + name;
}
idx[name] = i;
}
while(m--){
string name, s, opt = "";
getline(cin, name);
int num = name.size();
for (int i = 0; i < num - 1; i++)
if (name[i] == '.' && name[i + 1] == 'f')
opt = "1" + opt;
else if (name[i] == '.' && name[i + 1] == 's')
opt = "2" + opt;
for (int i = 0; i < num;i++)
if(name[i]=='.'){
name = name.substr(0, i);
break;
}
int cnt = idx[name];
s = str[cnt];
num = s.size();
while(opt!=""){
num = s.size();
stack<char> stk;
int end1, end2;
for (int i = 4; i < num;i++){
if(s[i]=='<')
stk.push(s[i]);
if(s[i]=='>')
stk.pop();
if (s[i] == ','&&stk.size()==1){
end1 = i;
break;
}
}
for (int i = num - 1; i >= 0;i--)
if(s[i]=='>'){
end2 = i;
break;
}
if (opt.back() == '1')
s = s.substr(5, end1 - 5);
else
s = s.substr(end1 + 1, end2 - end1 - 1);
opt.pop_back();
}
//cout << s << ' ' << opt << endl;
num = s.size();
for (int i = 0; i < num;i++)
if(s[i]==' '){
s = s.substr(0, i);
break;
}
cout << s << endl;
}
return 0;
}