AtCoder Beginner Contest 190
题目A - Very Very Primitive Game
思路:模拟
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if(c == 0) {
if(a > b) {
cout << "Takahashi";
} else {
cout << "Aoki";
}
} else {
if(a >= b) {
cout << "Takahashi";
}else {
cout << "Aoki";
}
}
}
复杂度分析:
- 时间复杂度为 O ( 1 ) O(1) O(1),空间复杂度为 O ( 1 ) O(1) O(1)
题目B - Magic 3
思路:模拟
- 遍历过程中只要找到一个满足条件的 s p e l l spell spell 即可
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read() {
ll s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') {
s = s * 10 + ch - '0';
ch = getchar();
}
return s * w;
}
int main() {
int n, s, d;
cin >> n >> s >> d;
ll a, b;
bool ok = false;
for(int i = 0 ; i < n; i++) {
a = read();
b = read();
if(a < s && b > d) ok = true;
}
if(!ok) {
cout << "No";
} else {
cout << "Yes";
}
}
复杂度分析:
- 时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)
题目C - Bowls and Dishes
思路:位运算
- 题目给定了 K < = 16 K <= 16 K<=16,暗示位运算
- 用一个数表示 K K K 个人选择集合,第 i i i 位上为 0 0 0 表示第 i i i 个人选择 C i C_i Ci, 1 1 1 表示选择 D i D_i Di。遍历所有 K K K 个人可能选择的集合,用桶 e [ j ] e[j] e[j] 维护各个 d i s h e s dishes dishes 里的 b a l l s balls balls 数量,然后遍历 M M M 个 c o n d i t i o n s conditions conditions,计算当前可满足的 c o n d i t i o n s conditions conditions 数量,更新全局最大值。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105;
int a[N], b[N], c[N], d[N], e[N];
int main() {
ll ret = 0;
int n, m;
cin >> n >> m;
for(int i = 0 ; i < m; i++) cin >> a[i] >> b[i];
int k;
cin >> k;
for(int i = 0 ; i < k; i++) cin >> c[i] >> d[i];
for(int mask = 1; mask < (1 << k); mask++) {
ll cur = 0;
fill(e, e + N, 0);
for(int j = 0; j < k; j++) {
if((1 << j) & mask) {
e[d[j]]++;
} else {
e[c[j]]++;
}
}
for(int i = 0; i < m; i++) {
if(e[a[i]] && e[b[i]]) {
cur++;
}
}
ret = max(ret, cur);
}
cout << ret;
}
复杂度分析:
- 时间复杂度为 O ( 2 K ∗ M ) O(2^K * M) O(2K∗M),空间复杂度为 O ( N ) O(N) O(N)
题目D - Staircase Sequences
思路:模拟
- 要求所有差为 1 1 1 且和为 N N N 的等差数列,不妨设等差数列为 [ a , b ] [a, b] [a,b],则有 ( a + b ) ( b − a + 1 ) = 2 N (a + b)(b - a + 1) = 2N (a+b)(b−a+1)=2N,故遍历所有 2 N 2N 2N 的因子,只要两个因子奇偶性不同,便可构造一个对应的解。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read() {
ll s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') {
s = s * 10 + ch - '0';
ch = getchar();
}
return s * w;
}
int main() {
ll ret = 0, n;
n = read();
n *= 2;
for(int i = 1; i <= n / i; i++) {
if(n % i == 0) {
if(abs((n / i) - i) % 2 == 1) {
ret++;
}
}
}
cout << ret * 2;
}
复杂度分析:
- 时间复杂度为 O ( 2 N ) O(\sqrt{2N}) O(2N),空间复杂度为 O ( 1 ) O(1) O(1)
关注GTAlgorithm,专注周赛、面经题解分享,陪大家一起攻克算法难关~