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;
}