比赛链接:Here

1560A. Dislike of Threes

Description

找出第 $k$ 大的不可被 $3$ 整除以及非 $3$ 结尾的整数

直接枚举出前 1000 个符合条件的数,然后输出

int main() {
cin.tie(nullptr)->sync_with_stdio(false);
vector<int>a;
int i = 1;
while (a.size() != 1000) {
if (i % 3 != 0 && i % 10 != 3) a.push_back(i);
i += 1;
}
int _; for (cin >> _; _--;) {
int n; cin >> n;
cout << a[n - 1] << "\n";
}
}

1560B. Who's Opposite?

Description

一些人均匀站成一圈,每人的编号从 $1$ 开始,给定 $a,b,c$ 三个整数,$a,b$ 是通过圆心看向对方,请问是否存在 $c$ 的对位,如果存在则输出相应编号,否则输出 $-1$

通过样图容易发现对位的编号差的两倍即 \(n\)​ 的大小,所以如果 \(c\)​ 存在对位的话,肯定是 \(c + Siz / 2\ or\ c - Siz/2\)​​​

当然注意边界

int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int a, b, c; cin >> a >> b >> c;
int n = 2 * abs(a - b);
if (a > n || b > n || c > n) {cout << "-1\n"; continue;}
cout << (n / 2 + c - 1) % n + 1 << "\n";
}
}

1560C. Infinity Table

题意:给定 \(n\) 请问 \(n\) 在第几行第几列

好明显的规律题?但赛时没想太多,跑了暴力

  • 先找到第 \(i\) 行第 \(i\) 列的数值,然后在第 \(i\) 行和第 \(i\) 列上循环跑一下即可
  • 因为 \(n\le 10^9\)​ 最多 \(10^3\)​ 行保证不会 TLE
void solve() {
ll x; cin >> x;
ll i = 1;
while (i * i < x) i++;
ll j = i - 1;
ll tmp = x - j * j;
if (tmp <= i) cout << tmp << " " << i << endl;
else {
int t = i * i - x;
cout << i << " " << t + 1 << endl;
}
}

1560D. Make a Power of Two

D题开始搞自己了,

给定一个整数 \(n (n\le 10^9)\) 和两种操作,

  • 删除 \(n\) 的任何一位
  • 在最右边加一位(可以是 \(0\sim 9\) 任何一个数)

请问最少的操作数使得 \(n\) 为 \(2^k(0\le k)\)​


\[QAQ
\]

这很明显 \(k\) 最大也就 \(64\)​ ,直接枚举了,然后比较原字符串和 \(2^k\) 的位数差:\(len_s +len_t - 2 * cnt\)​ ,\(cnt\)​ 为相同位数个数

相同类型:AcWing 3796. 凑平方

来自群友的详细思路,From 群友d3ac

题目关键信息: 随便删除,只能在右边加,前导零不自动删除

  • 因为要看看到底操作几次就可以变得和\(2^k\ \ (0\le k\le 63)\)相等,拿到题我们就先想暴力一点的做法,判断时间复杂度,再考虑优化.所以最暴力的就是直接枚举\(2^k\),再与\(n\)来作比较,看看需要操作几次
  • 计算时间复杂度:\(10^4*63*9\)<\(10^{8-9}\),所以行.
  • 然后再来考虑怎么把\(n\)与\(2^k\)进行比较,来计算需要几个操作,这个其实就是字符串匹配,将\(2^k\)来匹配原来的\(n\),因为只能从左边添加字符,假设\(2^k=1024\)所以\(n\)中必须是有从\(1\)到\(4\)连续且有顺序排列的才行,举个例子:\(n=1052\),匹配成功了\(3\)个,\(n=2052\),匹配成功\(0\)个,因为必须要删除完所有的才能加入\(1\).
  • 再考虑一点小小的优化和怎么写才好写
    • 将\(2^k\)预处理出来,放在一个数组里面方便每次用,减少时间复杂度.
    • 将\(n\)和\(2^k\)都转换为字符串,方便处理.
  • 设\(n\)的字符串下长度为\(Len\),匹配成功了\(now\)个(注意,\(now\)指向的是下一个位置,所以要\(now--\)),当前\(2^k\)的长度是\(len[i]\).最终的答案就是\(len[i]-now+Len-now\),其中\(len[i]-now\)是\(n\)需要添加的,\(Len-now\)是需要删除的.

注意:需要枚举到\(2^{32}\)才行

int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
string s; cin >> s;
int ans = 1e9;
for (int i = 0; i < 64; ++i) {
string t = to_string(1ull << i);
int k = 0;
for (int j = 0; j < int(s.size()); ++j)
if (k < int(t.size()) && s[j] == t[k]) k += 1;
ans = min(ans, int(s.size() + int(t.size()) - 2 * k));
}
cout << ans << '\n';
}
}

1560E. Polycarp and String Transformation

From 群友d3ac

首先思考一下给出的字符串那么长,到底该怎么去分割开,要是分割开,那就爽歪歪.

  • 以\(everywherevrywhrvryhrvrhrvhv\)为例子
  • 正常分割\(everywhere \ \ vrywhr \ \ vryhr \ \ vrhr \ \ vh \ \ v\)

所以不难看到,要想把他分出来还是有点难度的,但是每次会删除一个字符,我们再倒过来看看,先是只有一种字母,然后再是只有两种字符……有全部的字母,所以我们倒序枚举,从字符串的末尾开始向头开始枚举的话,就可以找到删除的顺序,因为后删除的字符肯定在后面还会出现的,而先删除的字符就只会在前面,会后被枚举到,因此,我们找到了删除的顺序

再来考虑原字符串是什么,先这样,我们统计一下每个字母在大字符串出现了多少次,结果是这样的:

\(e=4\),\(w=2\),\(y=3\),\(r=8\),\(h=5\),\(v=6\).

每个字符在每次轮回的时候出现次数都是一样的,在删除了它之前是一个特定值\(x\),删除后就是\(0\),所以我们将所有的字符出现次数除上它是第几个被删除掉的,结果就是这样了

\(e=4\),\(w=1\),\(y=1\),\(r=2\),\(h=1\),\(v=1\)

然而母串,也就是原字符串中,每个字母出现次数也是也么多次.

至此,我们已经求出了字符串和顺序,要考虑\(-1\)就简单了,就是模拟题目所说过程,用我们得到的字符串去看,行不行就好了

注意:要memset 反例:aaabbb

int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
string t; cin >> t;
reverse(t.begin(), t.end());
map<char, int> freq;
string ord;
for (char c : t) {
if (!freq[c]) ord += c;
freq[c] += 1;
}
int n = int(ord.length());
int len = 0;
for (int i = 0; i < n; ++i) len += freq[ord[i]] / (n - i);
reverse(t.begin(), t.end());
if (len > t.size()) {
cout << "-1\n";
continue;
}
string s = t.substr(0, len);
reverse(ord.begin(), ord.end());
string reals = s;
string fin = "";
for (char c : ord) {
fin += s;
string news ;
for (char d : s)
if (d != c) news += d;
s = news;
}
if (fin == t) cout << reals << " " << ord << "\n";
else cout << "-1\n";
}
}

1560F2. Nearest Beautiful Number (hard version)

翻译一下官方题解(官方题解解释的很清楚,好评)

假设数字 \(n\)​ 包含 \(m\)​ 位数字,其十进制表示为 \(d_1d_2…d_m\)​。 所需的数字 \(x\)​ 不大于由 \(m\)​ 个数字 9 组成的数字。这个数字是 1-beautiful,而任何 1-beautiful 数字同时是 k-beautiful,所以 \(x\)​ 最多包含 \(m\)​ 个数字。 同时,\(x≥n\)​ 所以 \(x\)​ 至少包含 \(m\)​ 位数字。 因此,所需的数字正好包含 \(m\)​ 位数字。

因为我们要寻找最小的 \(x\)​,所以我们需要首先最小化第一个数字,然后再最小化第二个数字,等等。因此,我们需要找到 \(n\)​ 的十进制表示的前缀,它是十进制表示的前缀的 \(x\)。 让我们贪心地做吧。

我们找出包含不超过 \(k\)​​​​ 个不同数字的 \(n\)​​​​ 的最大前缀。 假设前缀的长度为 \(p\)​​​​。 如果 \(p=m\)​​​​,那么 \(n\)​​​​​ 已经是 k-beautiful 的了,直接输出即可。 否则,让我们像数字一样将前缀增加 \(1\)​​​​,例如 如果 \(n=1294\)​​​ 且 \(p=3\)​​​,那么我们将 \(129\)​​​ 加 \(1\)​​​,结果前缀为 \(130\)​​。所有其他数字 \((d_{p+2},d_{p+3},...,d_m)\)​,让我们设置为零(例如,如果 \(n=1294\)​ 并且 \(p=3\),那么 \(n\) 就会变成 \(1300\) )。 旧 \(n\) 的答案就是新 \(n\) 的答案。 为了得到新 \(n\) 的答案,让我们再次开始描述的过程来准备新 \(n\)。

具体可以再参考代码理解

  • 时间复杂度:\(\mathcal{O}(m^2)\)
void solve() {
string s;
int k;
cin >> s >> k;
while (true) {
set<char> cs;
for (auto c : s) cs.insert(c);
if (cs.size() <= k) {cout << s << "\n"; return ;} cs.clear();
int lst = 0;
for (;; lst++) {
cs.insert(s[lst]);
if (cs.size() > k) {
while (s[lst] == '9') lst -= 1;
s[lst]++;
for (int i = lst + 1; i < s.size(); ++i) s[i] = '0';
break;
}
}
}
}

JLY 关于F1的代码:Here

Codeforces Round #739 (Div. 3) 个人题解(A~F2)的更多相关文章

  1. # Codeforces Round #529(Div.3)个人题解

    Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...

  2. Codeforces Round #557 (Div. 1) 简要题解

    Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...

  3. 刷题记录:Codeforces Round #739 (Div. 3)

    Codeforces Round #739 (Div. 3) 20210907.网址:https://codeforces.com/contest/1560. --(叹). A 不希望出现带" ...

  4. Codeforces Round #540 (Div. 3) 部分题解

    Codeforces Round #540 (Div. 3) 题目链接:https://codeforces.com/contest/1118 题目太多啦,解释题意都花很多时间...还有事情要做,就选 ...

  5. Codeforces Round #538 (Div. 2) (A-E题解)

    Codeforces Round #538 (Div. 2) 题目链接:https://codeforces.com/contest/1114 A. Got Any Grapes? 题意: 有三个人, ...

  6. Codeforces Round #531 (Div. 3) ABCDEF题解

    Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...

  7. Codeforces Round #527 (Div. 3) ABCDEF题解

    Codeforces Round #527 (Div. 3) 题解 题目总链接:https://codeforces.com/contest/1092 A. Uniform String 题意: 输入 ...

  8. Codeforces Round #499 (Div. 1)部分题解(B,C,D)

    Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...

  9. Codeforces Round #545 (Div. 1) 简要题解

    这里没有翻译 Codeforces Round #545 (Div. 1) T1 对于每行每列分别离散化,求出大于这个位置的数字的个数即可. # include <bits/stdc++.h&g ...

  10. Codeforces Round #624 (Div. 3)(题解)

    Codeforces Round #624 (Div.3) 题目地址:https://codeforces.ml/contest/1311 B题:WeirdSort 题意:给出含有n个元素的数组a,和 ...

随机推荐

  1. vue中export default function 和 export function 的区别

    export default function 和 export function 的区别 // 第一种 export default function crc32() { // 输出 // ... ...

  2. 3C智能移动周边产品龙头企业如何集成企业内部所有异构系统数据

    全面并自动集成品胜集团全域业务系统中的各类业务数据:结构化.标准化.自动化集团全部异构系统数据,提升全公司整体项目管理水平:梳理与简化跨部门.跨系统流程,清晰定义流程节点及业务边界,打通部门间信息流通 ...

  3. wps表格求标准差怎么算?

    在WPS表格中,要计算标准差,可以使用STDEV函数.标准差是一种衡量数据集合离散程度的统计指标.下面我将详细介绍如何使用STDEV函数来计算标准差. STDEV函数的语法为:STDEV(range) ...

  4. SnagIt 9-12 注册码

    SnagIt 9 注册码: AM5SC-8LWML-MVMWU-DTLGE-ERMBE SnagIt 10 注册码: 5HCAK-DEGMZ-EYABA-M4LCC-ACBE2DFKDA-JZ5FC- ...

  5. 【UniApp】-uni-app-内置组件

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-全局数据和局部数据 那么了解完了uni-app-全局数据和局部数据之后,这篇文章来给大家介绍一下 UniApp 中内置组件 首先不管三 ...

  6. 关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)

    当在Git中有多个开发者在同一个分支上工作时,可能会发生分支冲突.分支冲突指的是多个开发者在同一时间修改相同的代码文件,导致Git无法自动合并这些更改. 比如说:我在github上进行了md文件的修改 ...

  7. 【scikit-learn基础】--『预处理』之 标准化

    数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...

  8. vue-test4 -------组件之间的数据传递

    <template> <h3>CompA</h3> <component-b :onfun="dateFun"></compo ...

  9. Java使用线程池和缓存提高接口QPS

    1.什么是QPS? QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒可以相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标 ...

  10. XILINX HLS 入坑记录 之 写RAM 综合出 读取+写入Ram

    最近使用 Xilinx HLS 来开发 算法的IPcore,使用的Vitis 2021,发现光是 EDA 工具就存在很多的bug,比如: 1.经常C综合 停留在 Using flow_target ' ...