Educational Codeforces Round 104 (Rated for Div. 2)A~E解题报告

Educational Codeforces Round 104 (Rated for Div. 2)

A. Arena

\quad原题链接

http://codeforces.com/contest/1487/problem/A
在这里插入图片描述

\quad解题思路

首先,我们看战斗次数是无限的,任意非最小值的英雄都有赢得次数,既然有场次可以赢,那么我们就可以给他安排连胜的序列,是可以成为最后的 winnner 的。因此最终结果为 n−cnt(min)n - cnt(min)ncnt(min)总英雄数量减去最小值的次数。

\quadAC代码

#include <bits/stdc++.h>
using namespace std;const int N = 1010, INF = 0x3f3f3f3f;
int a[N], n;int main()
{int t;  cin >> t;while (t -- ){cin >> n;int minblood = INF, cnt = 0;for (int i = 1; i <= n; i ++ )scanf("%d", &a[i]), minblood = min(minblood, a[i]);for (int i = 1; i <= n; i ++ )if (a[i] == minblood)cnt ++;cout << n - cnt << endl;}return 0;
}

B.Cat Cycle

\quad原题链接

http://codeforces.com/contest/1487/problem/B
在这里插入图片描述

\quad解题思路

一种很简单的思路

  • 当 n 为偶数时,是不会相撞的,结果很好求

  • 那么当n=2⋅i+1n = 2\cdot i + 1n=2i+1为奇数的时候,刚刚开始B=1,A=2⋅i+1B = 1, A = 2 \cdot i + 1B=1,A=2i+1,经过iii步骤达到B=i+1,A=i+1⟹B=i+2,A=i+1B=i+1,A= i+1\Longrightarrow B=i+2, A=i+1B=i+1,A=i+1B=i+2,A=i+1,也就是说会 经过iii布相撞,而且相撞后之后两者是刚好错开,距离仍旧是⌊n−12⌋\lfloor \frac{n-1} {2} \rfloor2n1,下面我们给出证明:
    假设A=cur,B=cur+1A=cur, B = cur+1A=cur,B=cur+1,即B、AB、ABA刚好发生冲突,那么我们证明下一次相撞会在什么时刻。
    若首先,倘若两者会相撞,那么要么A减到0,转变成n,要么B增加到了n + 1,变成了1,这样才会有相碰的机会。我们首先计算出 A循环需要的次数为cur - x = 0, x = cur次,B需要的次数为 cur + 1 + x = n + 1, x = n - cur 次。
    cur≤n−curcur \leq n - curcurncur,那么是 A 会由0转换成 n,然后有一次冲突,设冲突在 t 次,那么有
    cur−t+n=cur+1+t⟹t=n−12cur - t + n = cur + 1 + t\Longrightarrow t = \frac{n-1} {2}curt+n=cur+1+tt=2n1
    cur>n−curcur > n - curcur>ncur,,那么是 B由n+1向转换成 1,然后有一次冲突,设冲突在 t 次,那么有
    cur−t=cur+1+t−n⟹t=n−12cur - t = cur + 1 + t - n \Longrightarrow t = \frac{n-1} {2}curt=cur+1+tnt=2n1
    综上,冲突每n−12\frac{n-1} {2}2n1会发生一次!!

  • 因此, 直接冲突就会 + 1,

很狗的模拟简化复杂度思路

  • 当 n 为偶数时,是不会相撞的,结果很好求
  • 那么当n=2⋅i+1n = 2\cdot i + 1n=2i+1为奇数的时候,不难发现,每经过nnn次,那么B的原始位置会 + 2,即序列为1,3,5,⋅⋅⋅1, 3, 5, \cdot\cdot\cdot1,3,5,,最后到达 nnn,起始点发生冲突,重回(1,n)(1, n)(1,n)起点,也就是说循环为n∗(n−1)/2n * (n - 1) / 2n(n1)/2,那么循环内部以 nnn 为大步长,会冲突两次,那么大步长内部,也会有冲突,下面的冲突就需要列式子计算了。
  • 这个方法又麻烦,bug还多,坑惨我了

\quadAC代码

思路一代码

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 1010, INF = 0x3f3f3f3f;
int n, k;int main()
{int t;  cin >> t;while (t -- ){cin >> n >> k;k --;   // 这样的话,起点就是 (1, n)if (n % 2 == 1) // 奇数冲突会 + 1{k = k + k / (n / 2);}int idx = (1 + k) % n;if (idx == 0)   idx = n;printf("%d\n", idx);}return 0;
}

思路二代码

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 1010, INF = 0x3f3f3f3f;
LL a[N], n, K;void sol(LL n, LL k)
{if (n % 2 == 0) // 偶数{if (k % n == 0)printf("%d\n", n);elseprintf("%d\n", k % n);}else    // 奇数{k -= 1; // 因为要在初始状态LL mod = LL(n) * (n / 2);  // 循环k %= mod;if (k == 0) printf("1\n");else{LL cnt = k / n;    // 小循环k %= n;LL cur = (1 + cnt * 2);    // B编号if (cur > n)cur -= n;if (k == 0) // 次数耗尽printf("%lld\n", cur);else{LL nxt = (n - cur) / 2;    // 下一次相碰需要的步数if (k < nxt)    // 下一次不会碰了{cur += k;if (cur > n)cur -= n;printf("%lld\n", cur);}else{k -= nxt;cur = cur + nxt + 1;if (cur > n)cur -= n;// 当前的位置是 cur, n - nxt, 还剩下 k 步骤LL A = n - nxt;LL B = cur;if (k == 0){printf("%lld\n", B);return;}A = A - k;B = B + k;if (B <= n) // 还没走出去{printf("%lld\n", B);}else{B -= n;if (B >= A){B ++;}if (B > n)  B -= n;printf("%lld\n", B);}}}}}
}
int main()
{int t;  cin >> t;while (t -- ){cin >> n >> K;// printf("ans=\n\t");sol(n, K);}return 0;
}

C.Minimum Ties

\quad原题链接

http://codeforces.com/contest/1487/problem/C
在这里插入图片描述

\quad解题思路

本题就是一个比较简单的模拟题,倘若 nnn 为奇数,那么他对战的球队数量 n−1n - 1n1为偶数,那么是可以一半输,一半赢的,关键是如何找到这种方案。首先要想找的话,利用所有球队共有的性质,就可以完成每个队伍的输赢一半。
我们假设球队的数量为nnn,编号为1,2,3,⋅⋅⋅,n1,2, 3,\cdot\cdot\cdot,n1,2,3,,n,那么我们可以让他们围成一个圈,如下图所示。
在这里插入图片描述
让当前编号i,输给比他编号大的,赢编号比他小的,那么这样就完成了无矛盾的轮转对称
同理,奇数的时候,也是这样,不过中位数那个编号是平局。

\quadAC代码

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 1010, INF = 0x3f3f3f3f;
int n, a[N][N];int main()
{int t;  cin >> t;while (t -- ){cin >> n;static int cnt = 0;cnt = n - 1;    // 每支队伍比赛次数for (int i = 1; i < n; i ++ )   // 遍历队伍{if (cnt % 2 == 0)   // 一般赢,一半输{for (int j = 1; j <= n - i; j ++ ){if (j <= cnt / 2){printf("%d ", 1);}else{printf("%d ", -1);}}}else{int tie = (cnt + 1) / 2;for (int j = 1; j <= n - i; j ++ ){if (j < tie){printf("%d ", 1);}else if (j == tie){printf("%d ", 0);}else{printf("%d ", -1);}}}}cout << endl;}return 0;
}

D.Pythagorean Triples

\quad原题链接

http://codeforces.com/contest/1487/problem/D
在这里插入图片描述

\quad解题思路

就是一个简单的公式推导,最后可以使用二分log(n),也可以直接O(1)来写sqrt
在这里插入图片描述

\quadAC代码

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 1010, INF = 0x3f3f3f3f;
int n, a[N][N];int main()
{int t;  cin >> t;while (t -- ){static int tmp;cin >> n;// printf("Floor:");tmp = floor(sqrt(2 * n - 1));if (tmp % 2 == 0)   tmp -= 1;tmp = tmp / 2;cout << tmp << endl;}return 0;
}

E.Cheap Dinner

\quad原题链接

http://codeforces.com/contest/1487/problem/E
在这里插入图片描述

\quad解题思路

分层图 + 贪心进行求解。
对于a, b, c, d四个数组,首先我们用a数组更新b数组,再拿更新之后的b数组更新c数组,一定到d数组,进行结果输出。
关键在于如何进行相邻数组的更新,下面我们以a数组更新b数组为例进行叙述:
利用堆的性质进行贪心更新,首先将 a 的数值存入堆中,假设如今待更新的集合组为 set,那么我们将set中与当前下标冲突的取出,然后更新集合中的剩余数,并将集合清空,再讲原本冲突未更新的点放入,直到堆为空或者是b数组所有元素贪心更新完毕。
关键点是使用STL中的set来降低复杂度

\quadAC代码

#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 150010, M = 200010;
int a[N], b[N], c[N], d[N];
int n1, n2, n3, n4;
bool st[N];
int h[N], ne[M], e[M], idx;void add(int x, int y)
{e[idx] = y, ne[idx] = h[x], h[x] = idx ++;
}// 处理当前这一层
void deal(int a[], int b[], int n1, int n2)
{// initialpriority_queue<PII, vector<PII>, greater<PII> > pque;for (int i = 1; i <= n1; i ++ )if (st[i])pque.push(PII(a[i], i));// inputint m;  cin >> m;memset(h, -1, sizeof h);    idx = 0;for (int i = 1, x, y; i <= m; i ++ ){scanf("%d%d", &x, &y);add(x, y);}//memset(st, false, sizeof st);int surp = n2;PII cur;    int val, idx, u;set<int> s1;    set<int>::iterator it;for (int i = 1; i <= n2; i ++ )s1.insert(i);while (surp != 0 && pque.size()){cur = pque.top();   pque.pop();val = cur.first, idx = cur.second;for (int i = h[idx]; ~i; i = ne[i]){u = e[i];if (!st[u])s1.erase(u);}for (it = s1.begin(); it != s1.end(); it ++ )   // 主要是利用集合来去掉不合适的部分{static int v;   v = * it;b[v] = a[idx] + b[v];st[v] = true;surp --;}s1.clear();for (int i = h[idx]; ~i; i = ne[i]){u = e[i];if (!st[u])s1.insert(u);}}
}int main()
{// inputcin >> n1 >> n2 >> n3 >> n4;for (int i = 1; i <= n1; i ++ )scanf("%d", &a[i]);for (int i = 1; i <= n2; i ++ )scanf("%d", &b[i]);for (int i = 1; i <= n3; i ++ )scanf("%d", &c[i]);for (int i = 1; i <= n4; i ++ )scanf("%d", &d[i]);// 分层图按层次进行for (int i = 1; i <= n1; i ++ )st[i] = true;deal(a, b, n1, n2);deal(b, c, n2, n3);deal(c, d, n3, n4);// 结果输出int res = INF;for (int i = 1; i <= n4; i ++ )if (st[i])res = min(res, d[i]);if (res == INF) res = -1;cout << res << endl;return 0;
}

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

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

相关文章

LeetCode 1130. 叶值的最小代价生成树(区间DP/单调栈贪心)

文章目录1. 题目2. 解题2.1 DP2.2 单调栈贪心1. 题目 给你一个正整数数组 arr&#xff0c;考虑所有满足以下条件的二叉树&#xff1a; 每个节点都有 0 个或是 2 个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。&#xff08;知识回顾&#xff1a;如果一个…

03.结构化机器学习项目 W2.机器学习策略(2)

文章目录1. 进行误差分析2. 清除标注错误的数据3. 快速搭建你的第一个系统&#xff0c;并进行迭代4. 使用来自不同分布的数据&#xff0c;进行训练和测试5. 数据分布不匹配时&#xff0c;偏差与方差的分析6. 定位数据不匹配问题7. 迁移学习 Transfer learning8. 多任务学习 Mul…

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

Codeforces Round #702 (Div. 3) 全部题解 读错题意&#xff0c;写了半天真是心态爆炸&#xff0c;总的来看这次题目不难的。 A. Dense Array http://codeforces.com/contest/1490/problem/A 解题思路 相邻的数字必然是倘若不满足的话是需要插入数据的&#xff0c;那么我们…

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; 吴…