ABC 287题解

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) (Tx) 个字符分别匹配。因此,通过准备一个数组 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值