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 ...
随机推荐
- Linux 运维人员最常用 150+命令汇总
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 目录 版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 命令帮助手册1 命令帮助手册2 ...
- 泛微OA与ERP集成的关键要点
泛微OA办公系统与ERP系统的集成是为了实现企业内部各个系统之间的数据共享和协同工作,提高工作效率和管理水平.下面将详细介绍泛微OA办公系统如何与ERP系统集成以及轻易云数据集成平台在该过程中发挥的重 ...
- 使用halo快速搭建应用文档中心
背景 之前我写了一篇,用gitbook搭建文档中心,gitbook是一款搭建博客的技术,是静态博客技术,不带后台管理系统.不带数据库,要发文章的话,是通过提供markdown文件,渲染成html,通过 ...
- SFX的妙用——如何在不安装软件的情况下打开自定义格式文件?
前段时间看到群友讨论压缩包能不能运行,想起了N年前用自解压文件SFX实现的一个"需求":在没有安装任何应用软件的Windows(当时还要支持XP)上能双击打开自定义格式的文件.当时 ...
- 路径规划算法 - 求解最短路径 - A*(A-Star)算法
Dijkstra(迪杰斯特拉)算法 A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法.算法中的距离估算值与实际值越接近,最终搜索速度越快. A* ...
- springboot下添加日志模块和设置日志文件输出
前言 日志的使用将通过SLF4J来使用,SLF4J(Simple Logging Facade for Java)是一个为Java应用提供简单日志记录的接口.它的主要目标是在不同的日志系统之间提供一个 ...
- 通过shell定时去创建数据月份表
对于大数据的采集推送,有时为了方便会将一张大表的数据按照月份分别存储,尤其是在与流水表相关的业务情况,因此需要定时按照月份去创建表. 我有问过是否可以通过数据库的存储过程和事件触发器实现,得到的回答是 ...
- [ABC266G] Yet Another RGB Sequence
Problem Statement You are given integers $R$, $G$, $B$, and $K$. How many strings $S$ consisting of ...
- jenkins pipeline语法、自动生成、部署案例
Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成和持续交付: pipeline的编写都要写入到一个名为Jenkinsfile的文件中. 流水线脚本管理 Jenkinsfi ...
- NetSuite 开发日记:批量增删改
一.批量插入/创建 使用 record.create() 插入数据时,一次只能插入一条,有多条数据需要插入时只能通过循环的方式,这样效率非常慢,耗时会随着数据量的增大而呈线性增长,有一种巧妙的方式可以 ...