AtCoder Beginner Contest 190 题解(A-D)

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(2KM),空间复杂度为 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)(ba+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,专注周赛、面经题解分享,陪大家一起攻克算法难关~

字节跳动客户端一面面经(附答案)

字节跳动客户端二面面经(附答案)

字节跳动客户端三面面经(附答案)

层序遍历?套模板就够了

猜你喜欢

转载自blog.csdn.net/weixin_42396397/article/details/113447217