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

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. Java程序员必备技能:Collections工具类深度解析!

    在之前的文章中,我们学习了单列集合的两大接口及其常用的实现类:在这些接口或实现类中,为我们提供了不少的实用的方法. 本篇文章我们来介绍一种java开发者为我们提供了一个工具类,让我们更好的来使用集合 ...

  2. Android的内部存储和外部存储怎么区分?

    1.定义 内部存储:内部存储位于Android手机系统的data/data/<包名>这个目录下,内部存储是私有的,主要用于存储系统和应用程序的某些数据,对于其他应用程序来说是不可见的,并且 ...

  3. 火山引擎DataTester升级MAB功能,助力企业营销决策

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataTester,火山引擎推出的 AB 测试与智能优化平台,近日宣布对其 MAB(Multi-armed Ba ...

  4. [ABC270Ex] add 1

    Problem Statement You are given a tuple of $N$ non-negative integers $A=(A_1,A_2,\ldots,A_N)$ such t ...

  5. Storm 集群的搭建及其Java编程进行简单统计计算

    一.Storm集群构建 编写storm 与 zookeeper的yml文件 storm yml文件的编写 具体如下: version: '2' services: zookeeper1: image: ...

  6. Cloudeye对接Prometheus实现华为云全方位监控

    本文分享自华为云社区<Cloudeye对接Prometheus实现华为云全方位监控>,作者:可以交个朋友 . 一. 背景 云眼系统Cloudeye服务为我们提供了针对弹性云服务器.宽带等资 ...

  7. 【C#】【System.IO】关于拷贝文件夹以及(Directory和DirectoryInfo、File和FileInfo)的区别

    本次问题是想要拷贝文件夹,但是找了一圈发现只有File有Copy或者FileInfo的CopyTo,并没有Directory的拷贝操作方法. 针对C#中拷贝文件夹的方法就是先生成一个目标文件夹(des ...

  8. Rabin-Karp 字符串查找算法

    和一般的比较字符串的方式不同,Rabin-Karp 查找算法通过对子字符串进行 hash,如果在原有字符串中找到了 hash 值相同的字符串,那么继续比较是否是需要查找的字串,一般来讲,如果 hash ...

  9. .NET技术分享日活动-202202

    2022年02月19日下午,个人组织举办了山东地区的第四次.NET技术分享日活动.主要包含.NET常用技术.低代码.大前端.大数据和工作流等五个技术领域. 本次技术分享日活动面向了山东地区广大的.NE ...

  10. 什么是全场景AI计算框架MindSpore?

    摘要:MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端.边缘.云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛. MindSpo ...