A.Magical Sticks
题意:
给个长度为
的木棒,木棒可以拼接在一起。问最多可以拼接出多少根长度相等的木棒。
题解:
最终都拼成长度为的,
和
组合,
和
组合...最终答案为
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 2e5 + 5; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; void solve() { ll n; scanf("%lld", &n); printf("%lld\n", (n - 1) / 2 + 1); } int main() { int t; for (scanf("%d", &t); t >= 1; t--) solve(); }
B.
题意:
规定每个周期为天,你可以从任意一天开始连续涂色
天,询问可以形成多少种不同的形状
题解:
可以分成和
两种情况。
当时,
都只有一种形状,而
,有
个形状,因此答案为
当时,
都有
个形状,因此答案为
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 2e5 + 5; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; void solve() { ll n, r; scanf("%lld%lld", &n, &r); if (n <= r) printf("%lld\n", n * (n - 1) / 2 + 1); else printf("%lld\n", r * (r + 1) / 2); } int main() { int t; for (scanf("%d", &t); t >= 1; t--) solve(); }
C.A Cookie for You
题意:
有个食物
和
个食物
,有
个客人
和
个客人
,客人
每人会吃一个当前数量较多的那个食物,客人
每人会吃一个当前数量较少的那个食物,判断是否存在一种排列方式使得每个客人都能吃到食物
题解:
可以知道至多有个客人
可以吃到食物,且客人
全吃数量较少的那种食物才能取到最大值,因此将客人
排在最前面,客人
全排在后面,如果
则每个客人都能吃到
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 2e5 + 5; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; void solve() { ll a, b, n, m; scanf("%lld%lld%lld%lld", &a, &b, &n, &m); if (min(a, b) >= m && a + b >= n + m) puts("Yes"); else puts("No"); } int main() { int t; for (scanf("%d", &t); t >= 1; t--) solve(); }
D.Grid-00100
题意:
给定一个的全
矩阵,现在要将
个位置填为
。定义矩阵
的
,其中
为第
行中
的数量,
为第
列中
的数量,现在要求
最小,输出最小的方案
题解:
可以发现在一个位置放,对该行和该列的贡献都为
,为了使贡献最小,那么应该尽量放到不同行和不同列,所以每次可以在不同行不同列放
,同时可以发现
,当
时,
否则为
。
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 2e5 + 5; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; void solve() { int n, k; scanf("%d%d", &n, &k); printf("%d\n", k % n ? 2 : 0); for (int i = n - 1; i >= 0; i--) { for (int j = n - 1; j >= 0; j--) printf("%d", (i + j) % n * n + i < k); puts(""); } } int main() { int t; for (scanf("%d", &t); t >= 1; t--) solve(); }
E1. Asterism (Easy Version)
题意:
给定个怪兽,每个怪兽有
个糖果,一开始有
个糖果,现在依次和怪兽比糖果数,如果
,则获胜,糖果数
。
为初始有
个糖果,对怪兽的出场顺序进行排序,能全胜的排序数。同时给定一个质数
,如果
则输出这个
,其中
。
题解:
对进行排序,首先可以确定
时均不行,因为此时
,而
,因此
一定包含
。
那么由于不妨枚举
,对于每个
,可以确定在
位置的值为
,那么二分可得
的数记为
,那么该位置可以放置的数为
个,那么
,因此只要对每个位置判断一下
是否为
即可。
#include <bits/stdc++.h> using namespace std; int a[2005]; vector<int> ans; int main() { int n, p; scanf("%d%d", &n, &p); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a + 1, a + n + 1); for (int x = 1; x < a[n]; x++) { int flag = 1; for (int i = 1; i <= n; i++) { int pos = upper_bound(a + 1, a + n + 1, x + i - 1) - a - 1; if ((pos - i + 1) % p == 0) { flag = 0; break; } } if (flag) ans.push_back(x); } printf("%d\n", ans.size()); for (auto i : ans) printf("%d ", i); puts(""); return 0; }
E2.Asterism (Hard Version)
题意:
E2和E1的题意相同,。
题解:
因为,所以不可能再去枚举
了,其实从E1的结果可以发现答案都为连续的数,最开始的那个数也很好确定就为
,那么只要确定最大的数即可。想到如果
很大,答案就是
,那么如果
,那么至少前
个数可以随意取,因此答案一定包含
,由此可以想到上界就是最多前
个数可以自由移动,但是第
个数要固定,那么想想什么时候第
个数固定,就是
时,
,因此答案为
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[100005]; int main() { ll n, p, ans1 = 0, ans2 = 2e9; scanf("%lld%lld", &n, &p); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) { ans1 = max(ans1, a[i] - i + 1); if (i >= p) ans2 = min(ans2, a[i] - i + p); } printf("%lld\n",max(ans2 - ans1, 0ll)); for (int i = ans1; i < ans2; i++) printf("%lld ", i); return 0; }