Loading

AtCoder Beginner Contest 349




B - Commencement

难度: ⭐

题目大意

给定一个字符串, 问这个字符串中出现的字母是否都恰好为0个或者2个;

解题思路

数据很小, 暴力就行;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e5 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
int n, m, k;
int p[N];
map<int, int> mp;
signed main(){
    IOS;
    string s;
    cin >> s;
    for(int i = 0; i < s.size(); i++){
        mp[p[s[i] - 'a']]--;
        p[s[i] - 'a']++;
        mp[p[s[i] - 'a']]++;
    }
    bool f = true;
    for(auto x : mp){
        if(x.first == 0) continue;
        if(x.second != 2 && x.second != 0){
            f = false;
            break;
        }
    }
    if(f) cout << "Yes";
    else cout << "No";
	return 0;
}




C - Airport Code

难度: ⭐⭐

题目大意

给定字符串S和T, S由小写字母组成, T由大写字母组成且长度为3; 问能否用以下方式之一用S来获取T
一是从S中提取长度为3的子序列, 并将其转换为大写;
二是从S中提取长度为2的子序列, 并将其转换为大写, 然后再加个字母'X';

解题思路

也是打暴力;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e5 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
int n, m, k;
int p[N];
map<int, int> mp;
signed main(){
    IOS;
    string s, t;
    cin >> s >> t;
    int idx = 0;
    bool f = false;
    for(int i = 0; i < s.size(); i++){
        if(s[i] == t[idx] + 32){
            idx++;
            if(idx == t.size()){
                f = true;
                break;
            }
        }
    }
    if(f) cout << "Yes";
    else {
        if(idx == t.size() - 1 && t[idx] == 'X'){
            cout << "Yes";
        }
        else cout << "No";
    }
	return 0;
}




D - Divide Interval

难度: ⭐⭐⭐

题目大意

给定一个区间(L, R), 现在要求将其分割为若干个满足以下条件的子区间, 请问最少可以分成多少个;
子区间(l, r)满足: l = j * 2i, r = (j + 1) * 2i; 并且子区间之间都是首尾相连的;

解题思路

因为暴搜肯定会tle, 所以考虑贪心; 对于子区间的l, 我们优先用其因数中最大的2的次方就可以了;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e5 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
int n, m, k;
int p[N];
vector<PII> v;
void dfs(int u){
    if(u == m){
        cout << v.size() << endl;
        for(auto x : v){
            cout << x.first << ' ' << x.second << endl; 
        }
        exit(0);
    }
    for(int i = 60; i >= 0; i--){
        if((u == 0 || u >= p[i]) && u % p[i] == 0 && u + p[i] <= m){
            v.push_back({u, u + p[i]});
            dfs(u + p[i]);
            return;
        }
    }
}
signed main(){
    IOS;
    cin >> n >> m;
    for(int i = 0; i <= 60; i++) p[i] = pow(2, i);
    dfs(n);
	return 0;
}




E - Weighted Tic-Tac-Toe

难度: ⭐⭐⭐⭐

题目大意

小莫和安姐在下井字棋, 3 x 3的棋盘的格子上都有一个分数, 下在这个位置就可以得到这个分数; 如果平局的话, 则看谁的分数更高; 小莫先手, 请问两者博弈谁会赢;

解题思路

因为只有3 x 3的大小, 所以我们可以用搜索博弈; 我们用9位的二进制来表示棋盘情况; 假设本轮小莫下, 并且此时有若干种选择, 只要其中有一个方案可以赢, 那么小莫就必赢, 因为她可以选择跟着该方案下; 只有所有方案都会输时这一轮小莫才必输; 相应的安姐也同理;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e5 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
int n, m, k;
int g[50][50];
int p[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
bool check(int u){
    int st[3][3] = {0};
    for(int i = 0; i < 9; i++){
        if(u >> i & 1){
            st[i / 3][i % 3] = 1;
        }
    }
    for(int i = 0; i < 3; i++){
        bool f = true;
        for(int j = 0; j < 3; j++){
            if(st[i][j] != 1){
                f = false;
                break;
            }
        }
        if(f) return true;
    }
    for(int i = 0; i < 3; i++){
        bool f = true;
        for(int j = 0; j < 3; j++){
            if(st[j][i] != 1){
                f = false;
                break;
            }
        }
        if(f) return true;
    }
    if(st[0][0] && st[1][1] && st[2][2]) return true;
    if(st[0][2] && st[1][1] && st[2][0]) return true;
    return false;
}
bool dfs(int Fir, int Sec){
    if(check(Fir)){
        return true;
    }
    if(check(Sec)){
        return false;
    }
    if(n + m == 9){
        int a = 0, b = 0;
        for(int i = 0; i < 9; i++){
            if(Fir >> i & 1){
                a += g[i / 3][i % 3];
            }
        }
        for(int i = 0; i < 9; i++){
            if(Sec >> i & 1){
                b += g[i / 3][i % 3];
            }
        }
        if(a > b) return true;
        else return false;
    }
    else{
        if(n == m){
            for(int i = 0; i < 9; i++){
                if((Fir >> i & 1) || (Sec >> i & 1)) continue;
                n++;
                bool f = dfs(Fir | (1 << i), Sec);
                n--;
                if(f == true) return true;
            }
            return false;
        }
        else{
            for(int i = 0; i < 9; i++){
                if((Fir >> i & 1) || (Sec >> i & 1)) continue;
                m++;
                bool f = dfs(Fir, Sec | (1 << i));
                m--;
                if(f == false) return false;
            }
            return true;
        }
    }
}
signed main(){
    IOS;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            cin >> g[i][j];
        }
    }
    if(dfs(0, 0)) cout << "Takahashi";
    else cout << "Aoki";
	return 0;
}




F - Subsequence LCM

难度: ⭐⭐⭐⭐

posted @ 2024-04-14 17:25  mostimali  阅读(106)  评论(0编辑  收藏  举报