Codeforces Round #702 (Div. 3)解题报告

Codeforces Round #702 (Div. 3) 全部题解

读错题意,写了半天真是心态爆炸,总的来看这次题目不难的。

A. Dense Array

http://codeforces.com/contest/1490/problem/A
在这里插入图片描述
解题思路
相邻的数字必然是倘若不满足的话是需要插入数据的,那么我们模拟插入数据即可.
x=min(ai,ai+1),y=max(ai,ai+1)x = min(a_i, a_{i+1}), y = max(a_i, a_{i+1})x=min(ai,ai+1),y=max(ai,ai+1)

  • 倘若2∗x≤y2 * x \leq y2xy不需要操作
  • 否则,需要插入数据。不断的贪心插入 2⋅x2\cdot x2x,直到满足条件。 其实这有一个公式的,推导与公式如下所示。
    在这里插入图片描述
    模拟乘以2
#include <bits/stdc++.h>
using namespace std;typedef long long LL;
typedef pair<int, int> PII;
const int N = 1010, INF = 0x3f3f3f3f;
int n, a[N];
PII b[N];
bool st[N];int cal(int t1, int t2)
{int ret = 0;while (2 * t1 < t2){ret ++;t1 *= 2;}return ret;
}int main()
{int t;  cin >> t;while (t -- ){cin >> n;LL x = 0;for (int i = 1; i <= n; i ++ ){scanf("%d", &a[i]);}double cnt;for (int i = 1, t1, t2; i < n; i ++ ){t1 = min(a[i], a[i + 1]), t2 = max(a[i], a[i + 1]);if (t1 * 2 >= t2)   continue;else{x += cal(t1, t2);}}cout << x << endl;}return 0;
}

直接上公式,没有过,应该是小数精度会被卡

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
typedef pair<int, int> PII;
const int N = 1010, INF = 0x3f3f3f3f;
int n, a[N];int main()
{int t;  cin >> t;while (t -- ){cin >> n;LL x = 0;for (int i = 1; i <= n; i ++ ){scanf("%d", &a[i]);}double cnt;for (int i = 1, t1, t2; i < n; i ++ ){t1 = min(a[i], a[i + 1]), t2 = max(a[i], a[i + 1]);if (t1 * 2 >= t2)   continue;else{x += ceil(log(t2 * 1.0 / t1) / log(2)) - 1;}}cout << x << endl;}return 0;
}

B. Balanced Remainders

http://codeforces.com/contest/1490/problem/B
在这里插入图片描述
先统计出来%3\%3%3余数为0,1,20,1, 20,1,2数字的数量c0,c1,c2c_0, c_1, c_2c0,c1,c2,根据倘若多,那么一定会送走,倘若少,一定会挪进行这个性质进行模拟,而且对于特定的cic_ici他给别人,或者是别人给他的交易对象是一样的,即操作是固定的。

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
typedef pair<int, int> PII;
const int N = 100010, INF = 0x3f3f3f3f;
int n, a[N];
int c[5] = {0, 0, 0};int opt(int idx, int ave)
{int idx2 = (idx + 1) % 3, idx0 = (idx - 1 + 3) % 3;int need = 0;if (c[idx] < ave)	// 过少,需要向前一个索要{need = ave - c[idx];c[idx0] -= need;c[idx] += need;}else		// 太多,需要给下一个{need = c[idx] - ave;c[idx2] += need;c[idx] -= need;}return need;
}int main()
{int t;  cin >> t;while (t -- ){cin >> n;int ave = n / 3;memset(c, 0, sizeof c);for (int i = 1; i <= n; i ++ ){scanf("%d", &a[i]);c[a[i] % 3] ++;}int res = 0;for (int i = 0; i < 3; i ++ ){res += opt(i, ave);}printf("%d\n", res);}return 0;
}

C. Sum of Cubes

http://codeforces.com/contest/1490/problem/C
在这里插入图片描述
直接就是 将 i3i^3i3在map上进行打表就可以了。
很关键的是预处理多处理几个,不然很容易被卡

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 100010;
LL n;
LL a[N];
map<LL, bool> m;int main()
{int t;  cin >> t;for (LL i = 1; i <= 10010; i ++ )	// 这里仅仅写到 10000就会 WA,主要是怕他多往后走了一步,查询到了0{a[i] = i * i * i;m[a[i]] = true;}// cout << m[0] << endl;while (t -- ){scanf("%lld", &n);bool flag = false;LL surp;for (int i = 1; !flag && a[i] <= n; i ++ ){surp = n - a[i];if (m[surp] == true){flag = true;}}if (flag)   puts("YES");else    puts("NO");}return 0;
}

D. Permutation Transformation

http://codeforces.com/contest/1490/problem/D
在这里插入图片描述
在这里插入图片描述
一个简单的模拟dfs,每次在区间找最大值作为 root 即可

#include <bits/stdc++.h>
using namespace std;const int N = 110;
int a[N], n, depth[N];void build(int fa, int l, int r)
{if (l >= r) return;int u = -1, v = -1;// 左子树for (int i = l; i < fa; i ++ ){if (u == -1 || a[u] < a[i])u = i;}depth[u] = depth[fa] + 1;build(u, l, fa - 1);// 右子树for (int i = fa + 1; i <= r; i ++ ){if (v == -1 || a[v] < a[i])v = i;}depth[v] = depth[fa] + 1;build(v, fa + 1, r);
}int main()
{int t;  cin >> t;while (t -- ){scanf("%d", &n);for (int i = 1; i <= n; i ++ )scanf("%d", &a[i]);memset(depth, -1, sizeof depth);int v;for (int i = 1; i <= n; i ++ ){if (a[i] == n){v = i;break;}}depth[v] = 0;build(v, 1, n);cout << depth[1];for (int i = 2; i <= n; i ++ )printf(" %d", depth[i]);cout << endl;}return 0;
}

E. Accidental Victory

http://codeforces.com/contest/1490/problem/E
在这里插入图片描述
说白了就是看谁可以赢。
首先我们先将他们按照各自的数值排序,得到数组a1,a2⋅⋅⋅,ana_1,a_2\cdot\cdot\cdot,a_na1,a2,an,对应编号为idx1,idx2,⋅⋅⋅,idxnidx_1, idx_2, \cdot\cdot\cdot,idx_nidx1,idx2,,idxn,我们对数组求取前缀和sum1,sum2,⋅⋅⋅,sumnsum_1, sum_2,\cdot\cdot\cdot,sum_nsum1,sum2,,sumn
我们从后往前看,

  • nnn个是最大的,肯定有机会成为winner
  • n−1n-1n1倘若可以成为winnerwinnerwinner,当且仅当他赢过1n−21~n-21 n2个人,然后和ana_nan比较,倘若他成不了winnerwinnerwinner那么直接算法结束,比他小的人更成为不了winnnerwinnnerwinnner
  • 不断这样算下去即可
#include <bits/stdc++.h>
using namespace std;typedef long long LL;
typedef pair<LL, int> PII;
const int N = 200010;
vector<int> res;
LL a[N];
LL b[N];
PII c[N];
int n;bool cmp(const PII &t1, const PII &t2)
{return t1.first < t2.first;
}
int main()
{int t;  cin >> t;while (t -- ){scanf("%d", &n);for (int i = 1; i <= n; i ++ ){scanf("%lld", &a[i]);c[i].first = a[i];c[i].second = i;}sort(c + 1, c + n + 1, cmp);for (int i = 1; i <= n; i ++ )b[i] = b[i - 1] + c[i].first;res.clear();res.push_back(c[n].second);for (int i = n - 1; i >= 1; i -- ){if (b[i] >= c[i + 1].first)res.push_back(c[i].second);elsebreak;}sort(res.begin(), res.end());cout << res.size() << endl;cout << res[0];for (int i = 1; i < res.size(); i ++ )printf(" %d", res[i]);cout << endl;}return 0;
}

F. Equalize the Array

http://codeforces.com/contest/1490/problem/F
在这里插入图片描述
具体思路:
先用map将出现次数存储起来,统计出出现次数为iii的数字一共有cnticnt_icnti个,
那么我们首先模拟一下,想让所有数字出现的次数为iii或者是000,那么我们需要将出现次数小于等于iii的数字全部移除,需要的次数为cnt1⋅1+⋅⋅⋅cnti−1⋅(i−1)cnt_1\cdot1+\cdot\cdot\cdot cnt_{i-1}\cdot{(i-1)}cnt11+cnti1(i1)
需要将出现次数大于iii的数字次数缩减为iii
需要的操作次数为$$
⟹(i+1)⋅cnti+1+(i+2)⋅cnti+2+⋅⋅⋅+(n)⋅cntn−i⋅(cnti+1+cnti+2+⋅⋅⋅+cntn)\Longrightarrow(i+1)\cdot cnt_{i+1} + (i+2)\cdot cnt_{i+2}+\cdot\cdot\cdot+(n)\cdot cnt_n -i\cdot(cnt_{i+1}+cnt_{i+2}+\cdot\cdot\cdot+cnt_n)(i+1)cnti+1+(i+2)cnti+2++(n)cntni(cnti+1+cnti+2++cntn)
因此我们直接预处理出来 cnticnt_icnti的前缀数组和他们的加权成前缀数组即可

#include <bits/stdc++.h>
using namespace std;typedef pair<int, int > PII;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 200010;
int a[N + 5];
int n;
map<int, int> m;
int cnt[N + 5];
int sum[N + 5];
LL addval[N + 5];int main()
{int t;  cin >> t;while (t -- ){m.clear();scanf("%d", &n);for (int i = 1; i <= n; i ++ ){scanf("%lld", &a[i]);m[a[i]] ++;}memset(cnt, 0, sizeof cnt);memset(sum, 0, sizeof sum);memset(addval, 0, sizeof addval);map<int, int>::iterator it;for (it = m.begin(); it != m.end(); it ++)  // 出现it->second 次数的数字进行统计{/// printf("IT: %d, %d\n",  it->first, it->second);cnt[it->second] ++;}// 计算前缀数组和累加和数组for (int i = 1; i <= n; i ++ )  // 最多出现 n 次{sum[i] = sum[i - 1] + cnt[i];addval[i] = addval[i - 1] + LL(cnt[i]) * i;}
/*printf("CNT:\n\t");for (int i = 1; i <= n; i ++ ){printf("%d ", cnt[i]);}cout << endl;
*/LL res = 1e16;LL up, down;for (int i = 1; i <= n; i ++ ){down = addval[i - 1];up = (addval[n] - addval[i - 1]) - (sum[n] - sum[i - 1]) * i;res = min(res, up + down);}cout << res << endl;}return 0;
}

G. Old Floppy Drive

http://codeforces.com/contest/1490/problem/G
在这里插入图片描述
在这里插入图片描述
本题是一个较为隐蔽的二分题目,需要我们贪心预处理出来可以二分的数组。
首先我们先将前缀数组给求出来,
并且贪心得到 cnt不断增加,而且前缀和也增加的数字,将其放入数组v, 具体见代码max_val部分。
那么数组 v 是一个数值(无论是val,还是opt_cnt)都不断增加的数据

  • 倘若 xix_ixi在 数组 v 最大值的范围之内,那么直接二分找最小的cnt
  • 否则,需要判断一下整个原数组 a 的累加和是否大于零,倘若小于等于0,无解
  • 否则,是可以经过不断的循环找到这个数的,首先我们根据max(v)找到最小的循环次数,然后二分即可。
    本题最坑的点就是 long long 开的地方很多,几乎所有的数据都要开long long
#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int N = 200010;
int n, m;
LL a[N], x[N];
LL sum[N];
class Node
{
public:LL val, cnt;Node(LL _val = 0, LL _cnt = 0){val = _val, cnt = _cnt;}
}b[N];int main()
{int t;  cin >> t;while (t -- ){cin >> n >> m;LL cur_max = -INF;b[1] = Node(-INF, -1);int n2 = 1;sum[0] = 0LL;for (int i = 1; i <= n; i ++ ){scanf("%lld", &a[i]);sum[i] = sum[i - 1] + a[i];if (sum[i] > cur_max){cur_max = sum[i];b[++ n2] = Node(cur_max, i - 1);    // 注意在这里的 - 1}}for (int i = 1; i <= m; i ++ )scanf("%lld", &x[i]);// 当前的 b 数字 是 1~n val 增加, cnt增加的递增数组,下面我们的 x 仅仅只需要二分即可;/// printf("RES:\n\t");LL loop = sum[n];for (int i = 1; i <= m; i ++ ){if (b[n2].val >= x[i])  // 可以直接二分找 >= x[i] 的最小值{int l = 1, r = n2, mid;while (l < r){mid = l + r >> 1;if (b[mid].val >= x[i])r = mid;elsel = mid + 1;}printf("%lld ", b[l].cnt);}else    // 查看他的 loop{if (loop <= 0)  // 无法达到{printf("-1 ");}else{LL loopcnt = (x[i] - b[n2].val) / loop + ((x[i] - b[n2].val) % loop != 0);x[i] -= loopcnt * loop;int l = 1, r = n2, mid;while (l < r){mid = l + r >> 1;if (b[mid].val >= x[i])r = mid;elsel = mid + 1;}printf("%lld ", b[l].cnt + loopcnt * n);  // loopcnt 是乘以 n 的}}}puts("");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 930. 和相同的二元子数组(哈希+前缀和)

文章目录1. 题目2. 解题1. 题目 在由若干 0 和 1 组成的数组 A 中&#xff0c;有多少个和为 S 的非空子数组。 示例&#xff1a; 输入&#xff1a;A [1,0,1,0,1], S 2 输出&#xff1a;4 解释&#xff1a; 如下面黑体所示&#xff0c;有 4 个满足题目要求的子数组&#xff…

poj 3469(网络流模版)

题目链接&#xff1a;http://poj.org/problem?id3469 思路&#xff1a;终于把网络流的模版测试好了&#xff0c;在Dinic和Sap之间还是选择了Sap,事实证明Sap确实比Dinic效率高&#xff0c;在此贴出自己的网络流模版&#xff1a; 1 #include<iostream>2 #include<cstd…

盒子的真实宽高

盒子的宽 两边border 两边padding 盒子的高度 上下border 上下padding

04.卷积神经网络 W1.卷积神经网络

文章目录1. 计算机视觉2. 边缘检测示例3. 更多边缘检测4. Padding5. 卷积步长6. 三维卷积7. 单层卷积网络8. 简单卷积网络示例9. 池化层10. 卷积神经网络示例11. 为什么使用卷积&#xff1f;作业参考&#xff1a; 吴恩达视频课 深度学习笔记 1. 计算机视觉 举例&#xff1a;图…

JAVA基础学习预科部分 (Markdown + dox)2021/2/22持续更新中

javaSE从 2021/02/22开始&#xff0c;预计到2021/02/28&#xff0c;原本预计的算法题解先鸽一下。 -博客Blog的重要性 & Markdown语法 基础markdown语法 标题&#xff0c; 直接使用 ‘#’&#xff0c;一级二级…五级字体&#xff0c;斜体(左右个一个∗*∗)&#xff0c;加…

LeetCode 1031. 两个非重叠子数组的最大和(一次遍历,要复习)*

文章目录1. 题目2. 解题2.1 暴力枚举2.2 一次遍历1. 题目 给出非负整数数组 A &#xff0c;返回两个非重叠&#xff08;连续&#xff09;子数组中元素的最大和&#xff0c;子数组的长度分别为 L 和 M。&#xff08;这里需要澄清的是&#xff0c;长为 L 的子数组可以出现在长为…

Java入门篇 2021/02/22

Java入门篇 2021/02/22 Java的三大版本 java三大版本主要包括 JavaSE, JavaME, JavaEE&#xff0c;其中现如今的JavaME已经是很少见了&#xff0c;JavaSE是JavaEE的基础。 JDK、JER、JVM三个关系 JDK, JRE, JVM具体的关系可以参照下图&#xff0c;是名副其实的包含关系。 J…

LeetCode 911. 在线选举(二分查找)

文章目录1. 题目2. 解题1. 题目 在选举中&#xff0c;第 i 张票是在时间为 times[i] 时投给 persons[i] 的。 现在&#xff0c;我们想要实现下面的查询函数&#xff1a; TopVotedCandidate.q(int t) 将返回在 t 时刻主导选举的候选人的编号。 在 t 时刻投出的选票也将被计入…

java 流程控制篇 2021/02/26持续更新中

1. 用户交互Scanner 1.1 简单的Scanner用法 首先&#xff0c;需要 import java.util.Scanner其次&#xff0c;需要创建一个 Scanner 类的对象&#xff0c; Scanner s new Scanner(System.in);通过调用Scanner对象的方法来完成&#xff0c; 一定要注意有开有关&#xff0c;最…

04.卷积神经网络 W1.卷积神经网络(作业:手动/TensorFlow 实现卷积神经网络)

文章目录作业1&#xff1a;实现卷积神经网络1. 导入一些包2. 模型框架3. 卷积神经网络3.1 Zero-Padding3.2 单步卷积3.3 卷积神经网络 - 前向传播4. 池化层5. 卷积神经网络 - 反向传播5.1 卷积层反向传播5.1.1 计算 dA5.1.2 计算 dW5.1.3 计算 db5.2 池化层 - 反向传播5.2.1 最…

html的实战性介绍

Html 简介 超文本结构语言 html并非一种编程语言&#xff0c; 而是一种描述超文本文档的标记语言&#xff0c;用html编写的超文本文档成为html文档。 超文本文档指的是&#xff0c;可以加入图片、声音、动画、影视等内容&#xff0c;并可以利用超链接方便的从一个文件跳转到网…

LeetCode 808. 分汤(动态规划)

文章目录1. 题目2. 解题1. 题目 有 A 和 B 两种类型的汤。一开始每种类型的汤有 N 毫升。有四种分配操作&#xff1a; 提供 100ml 的汤A 和 0ml 的汤B。提供 75ml 的汤A 和 25ml 的汤B。提供 50ml 的汤A 和 50ml 的汤B。提供 25ml 的汤A 和 75ml 的汤B。 当我们把汤分配给某…

LeetCode 848. 字母移位(前缀和+取模)

文章目录1. 题目2. 解题1. 题目 有一个由小写字母组成的字符串 S&#xff0c;和一个整数数组 shifts。 我们将字母表中的下一个字母称为原字母的 移位&#xff08;由于字母表是环绕的&#xff0c; ‘z’ 将会变成 ‘a’&#xff09;。 例如&#xff0c;shift(a) b&#xff…

第一章、OS引论1

1.1 操作系统的目标和作用 1.1.1 操作系统的目标 计算机上安装操作系统&#xff0c;主要目标是&#xff1a;方便性、有效性、可扩充性和开放性。 方便性&#xff1a;方便用户&#xff0c;使计算机变得易学易用有效性&#xff1a;提高系统资源(资源指CPU(处理机),存储器,文件(…

LeetCode 858. 镜面反射(最小公倍数/最大公约数)

文章目录1. 题目2. 解题1. 题目 有一个特殊的正方形房间&#xff0c;每面墙上都有一面镜子。 除西南角以外&#xff0c;每个角落都放有一个接受器&#xff0c;编号为 0&#xff0c; 1&#xff0c;以及 2。 正方形房间的墙壁长度为 p&#xff0c;一束激光从西南角射出&#xf…

Ubuntu从零安装 Hadoop And Spark

安装 linux 以Ubuntu为例 选择镜像&#xff0c;虚拟机安装 虚拟机下&#xff0c;直接安装镜像即可&#xff0c;选择好自己的配置&#xff0c;一定要注意路径名选好&#xff0c;而且和你虚拟机的名称匹配&#xff0c;这里我的镜像是 ubuntu-20.04.2.0-desktop-amd64.iso 切换…

04.卷积神经网络 W2.深度卷积网络:实例探究

文章目录1. 为什么要进行实例探究2. 经典网络3. 残差网络 ResNets4. 残差网络为什么有用5. 网络中的网络 以及 11 卷积6. 谷歌 Inception 网络简介7. Inception 网络8. 使用开源的实现方案9. 迁移学习10. 数据增强 Data augmentation11. 计算机视觉现状作业参考&#xff1a; 吴…

动态规划之最长上升子序列模型

动态规划分为很多模型&#xff0c;比如说数字三角形模型&#xff0c;最长上升子序列模型&#xff0c;背包模型&#xff0c;状态机模型&#xff0c;状态压缩&#xff0c;区间dp&#xff0c;树形dp等等 下面&#xff0c;我就Acwing提高课中&#xff0c;最长上升子序列模型进行了整…

LeetCode 900. RLE 迭代器(模拟/二分查找)

文章目录1. 题目2. 解题2.1 直接模拟2.2 二分查找1. 题目 编写一个遍历游程编码序列的迭代器。 迭代器由 RLEIterator(int[] A) 初始化&#xff0c;其中 A 是某个序列的游程编码。 更具体地&#xff0c;对于所有偶数 i&#xff0c;A[i] 告诉我们在序列中重复非负整数值 A[i …

html-css练习题(系统提示)

代码赏析&#xff1a;<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&qu…