呼,熬过一场考试,补下题吧

A. Robot Program

在一个二维无限方格中,初始时你在格子里,每秒你有5种决策:选择移动到上下左右四个格子中的一个或者停留在原地。你不能连续两秒做相同的决策,问最短时间走到格子 \((x,y)\)。

\[1 <= t <= 100,0<=x,y<=10^4
\]

「思路」

假设,首先花费步移动到,剩下就每次向上移动1秒再停留1秒即可。

时间复杂度:.

#include <bits/stdc++.h>
#define rep(i, s, t) for(register int i = (s), LIM=(t); i < LIM; ++i)
#define per(i, s, t) for(register int i = (s), LIM=(t); i >= LIM; --i)
using namespace std;
const int MXN = 2e5 + 5;
int n, m;
int ar[MXN];
void work() {
cin >> n >> m;
if(n > m) swap(n, m);
printf("%d\n", n * 2 + max(0, (m - n) * 2 - 1));
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);
int tim;
cin >> tim;
for(int cas = 1; cas <= tim; ++ cas) work();
return 0;
}

B. Toy Blocks

有个黑盒,每个黑盒有个玩具,Jack只能选中一个黑盒,并用最佳策略将里面的玩具全部分出去放到其他盒子里面,只有当最有个盒子里的玩具个数相同的时候他才会开心。

你要确保无论Jack选中那一个黑盒,最后他都能高兴。为了达成这个目的,你可以给某些黑盒增加一些玩具,问最少增加多少个玩具可以达成这个目的。

\[2<=n <= 10^5,0 <= a_i <= 10^9
\]

「思路」

显然要让其他个盒子的玩具个数全相同的最佳方案就是能保证让盒子里的玩具个数都等于它们中个数的最大值。所以只需要考虑选中最大的盒子和次大的盒子两种方案即可。

\[sum = 盒子中的最大数,Max = max(a_1,a_2,a_n)
\]

若选中最大的盒子,最少需要增加个玩具;选中次打盒子,最少需要增加个玩具。两者取max就是答案,最后只需要把玩具给较小的几个盒子补充即可。

时间复杂度:.

#include <bits/stdc++.h>
#define rep(i, s, t) for(register int i = (s), LIM=(t); i < LIM; ++i)
#define per(i, s, t) for(register int i = (s), LIM=(t); i >= LIM; --i)
using namespace std;
const int MXN = 2e5 + 5;
int n, m;
int64_t ar[MXN], br[MXN];
void work() {
cin >> n;
int64_t ans = 0, sum = 0, mx = 0;
for(int i = 0; i < n; ++i) {
cin >> ar[i];
sum += ar[i];
mx = max(mx, ar[i]);
}
if(n == 2) ans = 0;
else ans = max((n - 1 - (sum % (n - 1)))%(n - 1), mx * (n - 1) - sum);
printf("%lld\n", ans);
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);
int tim;
cin >> tim;
for(int cas = 1; cas <= tim; ++ cas) work();
return 0;
}

C. Two Brackets

给你一个字符串,每次操作是删掉字符串中的一个非空RBS子序列,问最多操作次数。

RBS串是:空串(RBS)[RBS]RBS+RBS

字符串总长度 \(<=2*10^5\)

「思路」

既然是最多操作次数,显然只用删()[]即可。对每个右括号记录前面有多少个未匹配的左括号即可。

时间复杂度:\(O(n)\)

#include <bits/stdc++.h>
#define rep(i, s, t) for(register int i = (s), LIM=(t); i < LIM; ++i)
#define per(i, s, t) for(register int i = (s), LIM=(t); i >= LIM; --i)
using namespace std;
const int MXN = 2e5 + 5;
int n, m;
void work() {
string ar;
cin >> ar;
n = ar.length();
int ans = 0, a = 0, b = 0;
for(int i = 0; i < n; ++i) {
if(ar[i] == '(') ++ a;
else if(ar[i] =='[') ++ b;
else if(ar[i] == ')' && a) ++ ans, -- a;
else if(ar[i] == ']' && b) ++ ans, -- b;
}
printf("%d\n", ans);
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);
int tim;
cin >> tim;
for(int cas = 1; cas <= tim; ++ cas) work();
return 0;
}

D. Radio Towers

给你一个代表有个城镇位于数轴到处,每个城镇有的概率建筑一个信号塔,你自己给第个信号塔分配信号强度为正整数,只要城镇满足即可搜到信号。同时你要保证两个条件:

  1. 城镇 \(0,n + 1\)不会搜到任何信号。
  2. 城镇 \([1,n]\)只能搜到一个信号塔的信号。

问能构建满足上述条件信号塔组合的概率,答案对998244353取模。

「思路」

赛后打前10项的表发现是斐波那契数列直接写,。orz

表示个城镇的合法信号塔组合的方案数,那么答案就是.

状态转移:\(dp[i] = dp[i - 1] + dp[i - 3] + dp[i-5] + ...+dp[i - 1 - 2 * k)]\)

其实就是枚举最后一步放一个带有信号塔的城镇且左右分别配上个城镇的转移。

因为只有左右城镇个数相同才是合法的转移。

初始化:\(dp[0] = dp[1] = dp[2] = 1\)

时间复杂度:.

#include <bits/stdc++.h>
#define rep(i, s, t) for(register int i = (s), LIM=(t); i < LIM; ++i)
#define per(i, s, t) for(register int i = (s), LIM=(t); i >= LIM; --i)
using namespace std;
const int mod = 998244353;
const int MXN = 2e5 + 5;
int n;
int64_t ar[MXN];
int64_t ksm(int64_t a, int64_t b, int kmod = mod) {
int64_t res = 1;
for(;b > 0; b >>= 1, a = (int64_t)a * a % kmod)
if(b & 1) res = (int64_t)res * a % kmod;
return res;
}
void work() {
cin >> n;
int64_t ans = 0, all = ksm(2, n);
ar[1] = 1, ar[2] = 1, ar[3] = 2;
for(int i = 4; i <= n; ++i) ar[i] = (ar[i - 1] + ar[i - 2]) % mod;
printf("%lld\n", ar[n] * ksm(all, mod - 2) % mod);
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);
int tim = 1;
// cin >> tim;
for(int cas = 1; cas <= tim; ++ cas) work();
return 0;
}

E. Two Editorials

有个人参加一场有个题目比赛,有两个出题人再同一时间分别开讲题解大会,所以每个人只能去一个人讲题现场。每个出题人都只讲连续的题。对于第题到第题,第个人都想听,设第个人能听到个想听的题的题解。你来安排两个出题人的讲题区间,和参赛者去听谁的题解,使得最大,请输出这个最大值。

\[1<=n,m<=2000,1 <= k <=n
\]

「思路」

假设第个参赛者的区间中点为 \(M\),左右两个讲题区间的中点为 \(A,B(A<=B)\)。

考虑一种贪心情况,对于第 \(i\) 个人必然是选择 \(A,B\)最靠近 \(M_i\)的,如果相同距离就任意选择一个即可。

所以我们先把参赛者按中点排序,一定是前一段区间参赛者 A听讲题,后一段区间参赛者 B听讲题。

再固定的情况下这样的贪心肯定没问题。接下来我们只需要枚举即可。

时间复杂度:.

#include <bits/stdc++.h>
#define rep(i, s, t) for(register int i = (s), LIM=(t); i < LIM; ++i)
#define per(i, s, t) for(register int i = (s), LIM=(t); i >= LIM; --i)
using namespace std;
const int MXN = 4e3 + 5;
int n, m, k;
class Node {
public:
int L, R;
bool operator<(const Node&b) const {
return L + R < b.L + b.R;
}
};
Node ar[MXN];
int64_t pre[MXN], cost[MXN][MXN];
int getcost(int a, int b, int c, int d) {
return max(0, min(b, d) - max(a, c) + 1);
}
void work() {
cin >> n >> m >> k;
rep(i, 0, m) {
cin >> ar[i].L >> ar[i].R;
++ pre[ar[i].L + ar[i].R];
}
rep(i, 1, n * 2 + 1) pre[i] = pre[i] + pre[i - 1];
sort(ar, ar + m);
for(int i = 1; i <= n; ++i) {
for(int j = 0; j <= m; ++j) {
cost[i][j] = getcost(i, min(i + k - 1, n), ar[j].L, ar[j].R);
if(j > 0) cost[i][j] += cost[i][j - 1];
}
}
int64_t ans = 0;
for(int fi = 1; fi <= n; ++fi) {
for(int se = fi; se <= n; ++se) {
int mid = (fi + fi + k - 1 + se + se + k - 1) / 2;
ans = max(ans, cost[fi][pre[mid] - 1] + cost[se][m - 1] - cost[se][pre[mid] - 1]);
}
}
printf("%lld\n", ans);
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);
int tim = 1;
// cin >> tim;
for(int cas = 1; cas <= tim; ++ cas) work();
return 0;
}

Educational Codeforces Round 98 (Rated for Div. 2) (A - E题题解)的更多相关文章

  1. Educational Codeforces Round 98 (Rated for Div. 2)

    A 如果\(n = m\),答案为\(2 \times n\):如果\(n \ne m\),答案为\(2 \times max(n,m) - 1\) #include <bits/stdc++. ...

  2. Educational Codeforces Round 76 (Rated for Div. 2)E(dp||贪心||题解写法)

    题:https://codeforces.com/contest/1257/problem/E 题意:给定3个数组,可行操作:每个数都可以跳到另外俩个数组中去,实行多步操作后使三个数组拼接起来形成升序 ...

  3. Educational Codeforces Round 92 (Rated for Div. 2) B、C题解

    TAT 第一场codeforces B. Array Walk #暴力 #贪心 题目链接 题意 有\(a1, a2, ..., an\) 个格子(每个格子有各自分数),最初为1号格(初始分数为\(a1 ...

  4. 【Educational Codeforces Round 38 (Rated for Div. 2)】 Problem A-D 题解

    [比赛链接] 点击打开链接 [题解] Problem A Word Correction[字符串] 不用多说了吧,字符串的基本操作 Problem B  Run for your prize[贪心] ...

  5. Educational Codeforces Round 59 (Rated for Div. 2) (前四题)

    A. Digits Sequence Dividing(英文速读) 练习英语速读的题,我还上来昏迷一次....只要长度大于2那么一定可以等于2那么前面大于后面就行其他no 大于2的时候分成前面1个剩下 ...

  6. Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal 题解(思维+逆序对)

    题目链接 题目大意 给你一个长度为n的字符串,可以交换相邻两个元素,使得这个字符串翻转,求最少多少种次数改变 题目思路 如果要求数组排序所需要的冒泡次数,那其实就是逆序对 这个也差不多,但是如果是相同 ...

  7. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  8. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  9. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  10. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

随机推荐

  1. [python] 基于Tablib库处理表格数据

    Tablib是一个用于处理电子表格(如 Excel,CSV,JSON)的Python 库.它提供了一种简单而强大的方式来操作和处理数据.利用Tablib,我们可以轻松地读取.写入.过滤和转换各种类型的 ...

  2. 如何使用 PreparedStatement 来避免 SQL 注入,并提高性能?

    前言 本篇文章主要如何使用 PreparedStatement 来避免 SQL 注入,并提高性能? 欢迎点赞 收藏 留言评论 私信必回哟 博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 ...

  3. jdk21的外部函数和内存API(MemorySegment)(官方翻译)

    1.jdk21:   引入一个 API,通过该 API,Java 程序可以与 Java 运行时之外的代码和数据进行互操作.通过有效地调用外部函数(即JVM外部的代码)和安全地访问外部内存(即不由JVM ...

  4. [ABC318G] Typical Path Problem

    Problem Statement You are given a simple connected undirected graph $G$ with $N$ vertices and $M$ ed ...

  5. [GDOI22pj2C] 教室的电子钟

    第三题 教室的电子钟 提交文件: clock.cpp 输入文件: clock.in 输出文件: clock.out 时间空间限制: 1 秒, 256 MB 为了迎接 GDOI,小蒟蒻学校所有教室的钟都 ...

  6. flask请求钩子(就是django的中间件)

    flask中的请求钩子就是域django的中间件类似,作用都是用于在请求前.后.响应前.后进行一些hook操作. 请求钩子装饰器 @app.before_request # 请求前会调用,一般可以用来 ...

  7. python操作mongodb副本集(mongodb高可用)

    https://pymongo.readthedocs.io/en/stable/examples/high_availability.html# pymongo比较"智能",只要 ...

  8. C++ Qt开发:Charts绘制各类图表详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWid ...

  9. 9.mysql的数据迁移到es中

    背景 从开发的角度说,就是老板叫我用es了,没那么多为什么,爸爸说了算 从业务角度,mysql已经不能满足我对全文检索的需求了.我需要检索某一个字段包含"圣诞节刚刚过去"这一字符串 ...

  10. Java 集合(二) Map

    Map 定义的是键值对的映射关系,一般情况下,都会选择 HashMap 作为具体的实现,除了 HashMap 之外,另一个使用到的比较多的 Map 实现是 TreeMap HashMap 构造函数 H ...