首页 > 其他分享 >AtCoder Beginner Contest 349

AtCoder Beginner Contest 349

时间:2024-04-14 17:34:41浏览次数:34  
标签:AtCoder false Beginner int st ++ true 349 define




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

难度: ⭐⭐⭐⭐

标签:AtCoder,false,Beginner,int,st,++,true,349,define
From: https://www.cnblogs.com/mostimali/p/18134404

相关文章

  • ABC349
    Alink其实,有人赢比赛,就有人输比赛,一加一减,不管进行多少场比赛,最后所有人的分数和一定是\(0\)。那么知道\(n-1\)个人的分数和,就可以知道第\(n\)个人的了。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn;intsum;inta[105];signedmain(){ cin>......
  • [abc349] [E - Weighted Tic-Tac-Toe ] 搜索
    搜索importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.math.BigInteger;importjava.util.StringTokenizer;publicclassMain{staticlong[][]board=newlong[3][3];staticint[][]chosed=n......
  • ABC349E
    E-WeightedTic-Tac-Toe(atcoder.jp)这可不是博弈论!推了半天性质,脑子要干爆了,发现这题固定的\(3\times3\)棋盘,可以爆搜啊。直接用搜索模拟所有过程即可,难点在优雅地实现。inta[9];intdp[512][512];//记忆化inlineboolcheck(intX){for(inti=0;i<=......
  • [atcode abc349] D - Divide Interval
    解决方法,贪心。importjava.io.*;importjava.math.BigInteger;importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{longL,R;L=rd.nextLong();R=rd.nextLong();PrintWri......
  • AtCoder Beginner Contest 349
    A-ZeroSumGame(abc349A)题目大意\(n\)个人游戏,每局有一人\(+1\)分,有一人\(-1\)分。给定最后前\(n-1\)个人的分数,问第\(n\)个人的分数。解题思路零和游戏,所有人总分是\(0\),因此最后一个人的分数就是前\(n-1\)个人的分数和的相反数。神奇的代码n=input()prin......
  • AtCoder Beginner Contest 347
    A-Divisible#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<i64>;usingpii=pair<int,int>;usingpiii=tuple<int,int,int>;constintinf=1e......
  • 三十二 1349. 修理牛棚 (贪心)
    1349.修理牛棚(贪心)略importjava.util.*;publicclassMain{privatestaticfinalintN=210;privatestaticintM,S,C;privatestaticint[]a,b;publicstaticvoidmain(String[]args){Scannersc=newScanner(System......
  • atcoder beginer 347 (abc347) D E 题解
     D就是二进制下,哪些位置有重合(两个1),哪些位置没有重合(1个1,1个0),剩下的都是0。xor的结果<2^60,就是小于60位(二进制下)。注意要有要求两个数需要是2^60,于是要有大小的判断,因为有的a,b会2^60,但是按照题目要求,这个情况不行。比如xor的结果,60位都是1,然后a、b各有60个1,那么需要有30个1......
  • atcoder beginer 348 (abc348) D E F 题解
     E非常经典的树上操作(树上DP)。父节点到某个子节点,值是如何变化的。1#include<cstdio>2#include<cstdlib>3#include<cstring>4#include<cmath>5#include<cstdbool>6#include<string>7#include<algorithm>8#include<iost......
  • AtCoder Beginner Contest 348
    B-FarthestPoint难度:⭐题目大意一个坐标系有x个点,对于每个点找出距离其最远的点;解题思路数据很小,暴力就行;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl'\n'......