A - Majority
题目思路
主要考察基本循环知识
只需要循环一遍所有人的投票,每一次累加每个人投的票,最后比大小
代码
#include <iostream>
using namespace std;
int main(){
int n, f = 0, a = 0;
cin >> n;
for(int i = 1; i <= n; i++){
string s;
cin >> s;
if(s == "For"){
f++;
}
else{
a++;
}
}
if(f > a){
cout << "Yes";
}
else{
cout << "No";
}
return 0;
}
B - Postal Card
题目思路
主要考察对桶的理解
用一个数组记录每一次
S
S
S 的后3位,在输入
T
T
T 的时候趁机累加一下答案即可
代码
#include <iostream>
using namespace std;
const int maxN = 1000;
int a[maxN];
int main(){
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++){
string s;
cin >> s;
a[(s[3] - '0')* 100 + (s[4] - '0') * 10 + (s[5] - '0')]++;
}
int ans = 0;
for(int i = 1; i <= m; i++){
int t;
cin >> t;
if(a[t] > 0){
ans += a[t];
a[t] = 0;
}
}
cout << ans;
return 0;
}
C - Path Graph?
题目思路
主要考察图论的搜索和的树的理解
其实如果你已经在草稿纸上画了画一些数据,你就会发现如果这个图是个 path grapth 那么它必定是一棵树。我们可以总结一下,对于每一棵树其连接的节点不大于2,且其边的个数一定是点的个数减一,如果还是最终判断不出来这是不是棵树,那么我们可以枚举一下每个点可以到达哪个点,然后记录一下,最后如果还有点没有被记录,那么说明这个图有多个连通分量
代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
vector<vector<int> > G(n + 1);
for(int i = 1; i <= m; i++){
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
if(m != n - 1){
cout << "No" << endl;
return 0;
}
for(int i = 1; i <= n; i++){
if(G[i].size() >= 3){//不是树
cout << "No";
return 0;
}
}
vector<bool> vis(n + 1);
queue<int> q;
q.push(1);
while(!q.empty()){
int u = q.front();
q.pop();
for(auto& v : G[u]){
if(!vis[v]){
vis[v] = true;
q.push(v);
}
}
}
for(int i = 1; i <= n; i++){
if(!vis[i]){
cout << "No";
return 0;
}
}
cout << "Yes";
return 0;
}
D - Match or Not
题目思路
我们说两个字符 a a a 和 b b b 是匹配的,如果 a = b a=b a=b 或者至少有一个是 ? ? ? 那么,当且仅当S和T的第i个字符在所有 i = 1 , 2 , . . . , ∣ S ∣ i=1,2,...,∣S∣ i=1,2,...,∣S∣ 中匹配时,两个字符串 S S S 和 R R R 才匹配。此外,对于每个 x x x , S ′ S′ S′ 和 T T T 匹配,当且仅当S和T的前x个字符分别匹配,以及S和T的最后 ( ∣ T ∣ − x ) (∣T∣-x) (∣T∣−x) 个字符分别匹配。因此,通过准备一个数组 p r e i pre_i prei 表示 S S S 和 T T T 的前i个字符是否匹配,另一个数组 s u f i suf_i sufi 代表S和T的最后i个字符是否匹配,我们可以在 O ( 1 ) O(1) O(1) 时间内回答 x = 0 , 1 , 2 , . . . , ∣ T ∣ x=0,1,2,...,∣T∣ x=0,1,2,...,∣T∣ 中的每一个。
代码
#include <bits/stdc++.h>
using namespace std;
bool match_or_not(char a,char b){
return a=='?' || b=='?' || a==b;
}
int main() {
string S,T;
cin>>S>>T;
vector<int> pre(S.size()+1,false),suf(S.size()+1,false);
pre[0] = true;
for(int i=0;i<T.size();i++){
if(!match_or_not(S[i],T[i]))break;
pre[i+1] = true;
}
reverse(S.begin(),S.end());
reverse(T.begin(),T.end());
suf[0] = true;
for(int i=0;i<T.size();i++){
if(!match_or_not(S[i],T[i]))break;
suf[i+1] = true;
}
for(int i=0;i<=T.size();i++){
if(pre[i] && suf[T.size()-i])printf("Yes\n");
else printf("No\n");
}
return 0;
}