AtCoder Beginner Contest 182 Person Editorial
Problem A - twiblr
直接输出 \(2A + 100 - B\)
Problem B - Almost GCD
这里暴力枚举即可
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int N;
cin >> N;
vector<int> A(N);
for (int i = 0; i < N; ++i) cin >> A[i];
int Max = 0, idx = -1;
for (int i = 2; i <= 1000; ++i) {
int cnt = 0;
for (int j = 0; j < N; ++j)
if (A[j] % i == 0) cnt++;
if (Max < cnt) Max = cnt, idx = i;
}
cout << idx << '\n';
return 0;
}
Problem C - To 3
利用一个数能被 \(3\) 整除当且仅当其各位之和能被 \(3\) 整除。
- 如果本身能被 \(3\) 整除,则不需要删除。
- 如果被 \(3\) 除余 \(1\),则首先看是否能删去 \(1\) 个 \(1\),然后看是否能删去 \(2\) 个 \(2\)。
- 如果被 \(3\) 除余 \(1\),则首先看是否能删去 \(1\) 个 \(2\),然后看是否能删去 \(2\) 个 \(1\)。
C++ 代码
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
string s;
cin >> s;
int cnt[3] = {0};
for (int i = 0; i < s.length(); ++i) cnt[(s[i] - '0') % 3]++;
int cur = (cnt[1] + 2 * cnt[2]) % 3;
int k = cnt[0] + cnt[1] + cnt[2];
int res;
if (!cur) res = 0;
else if (cur == 1) {
if (cnt[1])
if (k == 1) res = -1;
else
res = 1;
else {
if (k == 2) res = -1;
else
res = 2;
}
} else {
if (cnt[2]) {
if (k == 1) res = -1;
else
res = 1;
} else {
if (k == 2) res = -1;
else
res = 2;
}
}
cout << res << "\n";
return 0;
}
Python 代码
s = input()
n = int(s)
if n % 3 == 0:
print(0)
else:
a = list(map(int, list(s)))
c = [0] * 3
for i in a:
c[i % 3] += 1
if c[n % 3] >= 1 and len(a) > 1:
print(1)
elif c[3 - n % 3] >= 2 and len(a) > 2:
print(2)
else:
print(-1)
Problem D - Wandering
记录最远位置 \(ans\),当前位置 \(pos\),前缀和 \(sum\),以及前缀和的最大值 \(hi\)。
在每一轮中,首先更新前缀和,然后更新前缀和的最大值,本轮能达到的最大值显然是 \(pos+hi\),用其更新 \(ans\),再用 \(pos+sum\) 更新 \(pos\)。
时间复杂度 \(\mathcal{O}(N)\)。
using ll = long long;
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
ll a, sum = 0, hi = 0, ans = 0, pos = 0;
for (int i = 0; i < n; ++i) {
cin >> a;
sum += a;
hi = max(hi, sum);
ans = max(ans, pos + hi);
pos += sum;
}
cout << ans << "\n";
return 0;
}
Problem E - Akari
将所有灯和墙都放到矩形中,然后逐行从左到右扫描一遍,再从右到左扫描一遍;逐列从上到下扫描一遍,再从下到上扫描一遍。最后统计亮着的格子即可。
时间复杂度 \(\mathcal{O}(HW)\)。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int e[1510][1510];
bool vis[1510][1510];
int cnt = 0;
struct node {
int x, y;
};
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int h, w, n, m;
cin >> h >> w >> n >> m;
vector<node> bulbs(n);
for (int i = 0; i < n; ++i) {
int x, y;
cin >> x >> y, e[x][y] = 1; // bulb
bulbs[i].x = x, bulbs[i].y = y;
}
for (int i = 0; i < m; ++i) {
int x, y;
cin >> x >> y, e[x][y] = 2; // block
}
for (int i = 0; i < n; ++i) {
int x = bulbs[i].x, y = bulbs[i].y;
if (vis[x][y] == false) {
cnt++, vis[x][y] = true;
}
while ((e[x][y] == 0 || (x == bulbs[i].x and y == bulbs[i].y)) &&
x > 0 && x <= h && y > 0 && y <= w) {
if (vis[x][y] == false) cnt++, vis[x][y] = true;
x++;
}
x = bulbs[i].x, y = bulbs[i].y;
while ((e[x][y] == 0 || (x == bulbs[i].x and y == bulbs[i].y)) &&
x > 0 && x <= h && y > 0 && y <= w) {
if (vis[x][y] == false) cnt++, vis[x][y] = true;
x--;
}
x = bulbs[i].x, y = bulbs[i].y;
while ((e[x][y] == 0 || (x == bulbs[i].x and y == bulbs[i].y)) &&
x > 0 && x <= h && y > 0 && y <= w) {
if (vis[x][y] == false) cnt++, vis[x][y] = true;
y--;
}
x = bulbs[i].x, y = bulbs[i].y;
while ((e[x][y] == 0 || (x == bulbs[i].x and y == bulbs[i].y)) &&
x > 0 && x <= h && y > 0 && y <= w) {
if (vis[x][y] == false) cnt++, vis[x][y] = true;
y++;
}
}
cout << cnt << '\n';
return 0;
}
Problem F - Valid payments
dalao 题解,Orz...
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 52;
ll a[N], mx[N], xx[N], dp[N][2];
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int n;
ll x, t;
cin >> n >> x;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i < n; ++i) mx[i] = a[i + 1] / a[i];
t = x;
for (int i = n; i; --i) {
xx[i] = t / a[i];
t %= a[i];
}
dp[1][0] = 1;
if (xx[1]) dp[1][1] = 1;
for (int i = 1; i < n; ++i) {
dp[i + 1][0] = dp[i][0];
if (xx[i + 1]) dp[i + 1][1] = dp[i][0];
dp[i + 1][1] += dp[i][1];
if (xx[i + 1] + 1 != mx[i + 1]) dp[i + 1][0] += dp[i][1];
}
cout << dp[n][0] << '\n';
return 0;
}
这道题,我们实际上就是要求出满足
\]
并且满足
\]
的整数元组 \(\{k_i\}\)的种数。
我们不妨从小到大进行选择。容易看到,我们其实只需要记录当前每一个可能达到的总数以及对应的方法数,而不需要记录对应的具体方案。因为\(a_{i+1}\)总是\(a_i\)的倍数,所以在选择完\(a_i\)的系数k_iki后,我们需要保证此时的总数能够被\(a_{i+1}\)整除。同时,因为\(|k_ia_i| < a_{i+1}\)的限制,因此,对于每一个原有的状态,我们实际上只能有两种选择。
我们以\(\{x,1\}\)作为初始状态开始递推。看起来,状态数会以指数规模增长,但实际上,任意时刻,我们最多同时保留两个状态,因此总时间复杂度为 \(\mathcal{O}(N)\)。
using ll = long long;
int main() {
int n;
ll x;
cin >> n >> x;
vector<ll> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
unordered_map<ll, ll> v;
v[x] = 1;
ll ans = 0;
for (int i = 0; i < n; ++i) {
unordered_map<ll, ll> nv;
for (auto [c, f] : v) {
if (i + 1 < n) {
ll rem = c % a[i + 1];
nv[c - rem] += f;
if (rem > 0) nv[c + a[i + 1] - rem] += f;
} else if (c % a[i] == 0)
nv[0] += f;
}
v = move(nv);
}
cout << v[0];
}
AtCoder Beginner Contest 182 Person Editorial的更多相关文章
- AtCoder Beginner Contest 182 D - Wandering (前缀和)
题意:在\(x\)轴上,你刚开始在\(0\)的位置,第\(i\)次操作需要走\(A_1,...,A_i\)个单位,如果\(A_i\)为正向右走,否则向左走,求你所能走到的最大坐标. 题解:我们一步一步 ...
- AtCoder Beginner Contest 182 F
F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 064 D - Insertion
AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...
随机推荐
- salesforce零基础学习(一百三十四)State And Country/Territory Picklists启用后的趣事
本篇参考: https://help.salesforce.com/s/articleView?id=sf.admin_state_country_picklists_overview.htm& ...
- 开发期间flask运行方式(1.x和2.x区别)
1.x使用app.run(参数) 可以使用debug=True控制处于什么模式. app.run(host="127.0.0.1", port=5000, debug=True) ...
- SSM整合 tomcat报错: <严重 [RMI TCP Connection(22)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到>
前提:学了一个暑假 从Javaweb -> mybits ->spring -> spring-mvc 打算跟着网上ssm整合项目做一个项目 在完成最后一步spring对spring ...
- Python——第五章:模块(Module)、自定义模块、第3方开源模块、包(Package)
什么是模块(Module)? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多代码按功能分组,分别放到不同的文件里,这 ...
- 【OpenCV】在 Mac OS 上使用 EmguCV
前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Androi ...
- vivo 海量微服务架构最新实践
作者:来自 vivo 互联网中间件团队 本文根据罗亮老师在"2023 vivo开发者大会"现场演讲内容整理而成.公众号回复[2023 VDC]获取互联网技术分会场议题相关资料. v ...
- Fpga开发笔记(一):高云FPGA芯片介绍,入手开发板套件、核心板和底板介绍
前言 FPGA作为一种逻辑芯片,硬件架构独特,具有并行性.低延时性和灵活性等特性,应用领域广泛. FPGA市场主要玩家是英特尔.AMD.莱迪思.Microchip.Achronix等:国内厂商包 ...
- 异步、多线程、Await/Async、Task
异步多线程经常被拿来说事,网上文章也是多如牛毛,我也是停留在很菜的水平,痛下决心好好"恶补"一下这块知识. 还是先放两个官方文档压压惊:使用 Async 和 Await 的异步编程 ...
- 数据库“意外失联”?华为云DRS异地多活灾备为您支招
[摘要] 为了更好地提供灾备保护,华为云数据库在"同城两中心"的基础上提出了异地保护的方案,华为云数据复制服务DRS推出了异地多活灾备,即"两地四中心". 在D ...
- 全域Serverless化,华为云引领下一代云计算新范式
本文分享自华为云社区<全域Serverless化,华为云引领下一代云计算新范式>,作者: 华为云PaaS服务小智 . 近日,华为开发者大会2023(Cloud)在东莞成功举办,期间&quo ...