AtCoder Beginner Contest 046

A - AtCoDeer and Paint Cans

可由 \(\rm set\) 的性质轻松解决。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	set<int> s;
	for (int i = 0; i < 3; i++) {
		int x;
		cin >> x;
		s.insert(x);
	}
	cout << s.size();
	return 0;
}

B - Painting Balls with AtCoDeer

做一件事,完成它需要分成 \(n\) 个步骤,且做第 \(1\) 步有 \(m_1\) 种不同的方法,做第 \(2\) 步有 \(m_2\) 不同的方法,…… 做第 \(n\) 步有 \(m_n\) 不同的方法。

那么完成这件事共有:\(N=m_1×m_2×m_3×…×m_n\) 种不同的方法。
第一个位置有 \(k\) 种涂法,相邻位置颜色不能相同,第二个位置可以涂 \(k×(k-1)^1\) 种颜色,...总共有 \(n\) 个位置,共有 \(k×(k-1)^{n-1}\) 种涂法。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int N, K;
	cin >> N >> K;
	int ans = K;
	for (int i = 0; i < N - 1; i++) ans *= (K - 1);
	cout << ans;
	return 0;
}

C - AtCoDeer and Election Report

票数总和要求最少,由于满足比例关系,那么各自的票数也应该最少。则题意转变为:给出两个数 \(A,B\)。只可以对 \(A,B\) 进行加操作,使其满足 \(A :B = a : b\) 且操作后 \(A,B\) 最小。
可知 \(A=ak\)\(B=bk\)。由于只能加操作,所以 \(k\) 等于 \(A/a\) \(\rm or\) \(B/b\) 向上取整后的结果。这两个结果需要取 \(\rm max\) 后与 \(a\)\(b\) 相乘,因为只能加操作。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

i64 _ceil(i64 x, i64 y) {//实现x / y向上取整(记忆!)
	return (x + y - 1) / y;
}

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int N;
	cin >> N;
	int t, a;
	cin >> t >> a;
	i64 A = t, B = a;//t、a互素,初始票数与之相等
	for (int i = 1; i < N; i++) {
		int x, y;
		cin >> x >> y;
		A = x * _ceil(A, x);
		B = y * _ceil(B, y);//先将A,B变成x,y的倍数,再看是否符合比例关系:
		if (A / x < B / y) {//A偏小,按比例关系更改
			A = B / y * x;
		} else {
			B = A / x * y;//B偏小,按比例关系更改
		}
	}
	cout << A + B;
	return 0;
}

D - AtCoDeer and Rock-Paper

贪心
只能出布或锤子,很明显的是出布更有优势(平局或胜利),而锤子(平局或负)不利。因此应该尽可能的多出布。题目又要求出锤子的数量 \(\geqslant\) 出布的数量,因此可以直接分别计算出两个数量。先遍历一遍字符串,优先把布的处理掉,然后再处理对方出锤子的情况。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	string s;
	cin >> s;
	int n = s.size(), ans = 0;
	int g = (n + 1) / 2, p = n - g;
	for (int i = 0; i < n; i++) {
		if (s[i] == 'p' && p > 0) {
			p--;
		}
	}
	for (int i = 0; i < n; i++) {
		if (s[i] == 'g' && p > 0) {
			p--;
			ans++;
		}
	}
	cout << ans;
	return 0;
}
posted @ 2024-08-21 21:16  胖柚の工作室  阅读(21)  评论(0)    收藏  举报