SMU Summer 2024 Contest Round 1

news/2024/10/6 1:32:18/文章来源:https://www.cnblogs.com/Kescholar/p/18290002

SMU Summer 2024 Contest Round 1

Dice and Coin

题意

给个 n 面骰子和一枚硬币,初始投骰子,若骰子的值在 1 到 \(K-1\) 之间则反复投硬币,硬币为正则该值翻倍,否则为 0 ,当值为 0 输掉游戏或者大于等于 \(K\) 时赢得游戏结束,问你可以赢得游戏的概率为多少。

思路

以 1 到 n 为初始值时,因为骰子为正时其值倍增,即一定是乘以一个 \(2^x\) 后大于等于 \(K\) ,所以以该值赢得游戏的概率就是 \(\frac{1}{x}\) ,累加 n 个初始值的胜利概率后除以 n 即可。

代码

#include<bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, k;cin >> n >> k;double ans = 0.0;i64 res = 1;vector<i64> c(50);for (int i = 0; i <= 30; i ++) {c[i] = res;res *= 2;}for (int i = 1; i <= n; i ++) {for (int j = 0; j <= 30; j ++) {if (c[j] * i >= k) {ans += 1.0 / (1.0 * c[j]);break;}}}ans /= n;printf("%.10lf\n", ans);return 0;
}

equeue

题意

给定一个长度为 n 的序列,和一个最大操作次数 k。
有以下四种操作:

  • 操作 A:在序列左侧取走一个数放入手中。
  • 操作 B:在序列右侧取走一个数放入手中。
  • 操作 C:将手中任意一个数放在序列左侧。
  • 操作 D:将手中任意一个数放在序列右侧。

也可以选择什么都不操作。
求在若干次操作后手中留下数的最大值。

思路

因数据量小,考虑暴力,但纯暴力会超时,因此需要使用优先队列优化。枚举操作A、B的次数,多出的次数则需要视情况执行C、D操作,若我们手中有一个负数,那么放回去可以使最终的和增大,反之我们则不操作,放回去的顺序一定是从小到大,负数越小,增大越多。

代码

#include<bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, k;cin >> n >> k;vector<int> a(n + 1);for (int i = 1; i <= n; i ++)cin >> a[i];i64 ans = 0;priority_queue<int, vector<int>, greater<int>> Q;for (int i = 0; i <= k; i ++) {for (int j = 0; j + i <= k && j + i <= n; j ++) {for (int l = 1; l <= i; l ++)Q.push(a[l]);for (int r = n; r > n - j; r --)Q.push(a[r]);i64 res = k - i - j;while (Q.size() && res-- && Q.top() < 0) Q.pop();res = 0;while (Q.size()) {res += Q.top();Q.pop();}ans = max(ans, res);}}cout << ans << '\n';return 0;
}

Sequence Decomposing

题意

给 n 个数,满足 $i < j $ 并且 \(A_i < A_j\)条件的可以染成一个颜色,问最少需要多少颜色可以全染色。

思路

其实类似就是让你找出若干个递增子序列,答案就是递增子序列的数量,因此我们可以从后往前枚举当前值,将当前值放在已有的递增子序列里末尾最接近它的那个序列里,比如当前值为 5 ,现有两个递增子序列 6 7 … 和 7 8 … ,最优应该是放在 6 后面,7 留给更有可能性的,否则之后再碰到 6 就需要重新以它为终点再开一个序列,那样就不是最少了。

这里我是用一个数组只存了每个序列的末尾一个数,因为也只用到这个数,当序列里有满足要求的就放进去,替换掉最后一个,否则新建一个序列。

代码

#include<bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i ++)cin >> a[i];int sum = 0;vector<int> c;for (int i = n; i > 0; i --) {auto t = upper_bound(c.begin(), c.end(), a[i]);if (t == c.end()) {c.push_back(a[i]);} else {*t = a[i];}}cout << c.size() << '\n';return 0;
}

Cell Distance

题意

给一个 \(n\times m\) 的矩阵,从中选出 \(k\) 个点,用 \(∑_{i=1}^{K−1}∑_{j=i+1}^K(∣x_i−x_j∣+∣y_i−y_j∣)\) 计算其贡献,问你将所有方案的贡献总和模 1e9+7 的答案。

思路

转换一下,先考虑 x 坐标的贡献(将 y 的贡献看成 0 )。

考虑两个点间 x 坐标相差为 \(d(1 ≤ d ≤ n−1)\) 时的贡献(\(d=0\) 的时候没有贡献所以这里不考虑)。设这两个点的坐标为 \((x_1,y_1)、(x_2,y_2)\),那么就有 \(x_1 − x_2 = d,1 ≤ x_1 ,x_2 ≤ n,1 ≤ y_1 ,y_2 ≤ m\)

则可行的 \(x_1,x_2\)\(n−d\)\(\{(x_1,x_2)|(1,𝑑+1),(2,𝑑+2),⋯ ,(𝑛−𝑑,𝑛)(1,d+1),(2,d+2),⋯,(n−d,n)\}\)\(y_1,y_2\) 各有 m 种取法。所以像这样的点对共有 \((n-d) \times m^2\) 对,每一对的贡献为 d,总的贡献就是 \(d \times (n - d) \times m^2\)

每一个点对出现在选出的 k 个点中的方案数共有 \(𝐶_{𝑛×𝑚−2}^{𝑘−2}\) (除去这两个点之外,剩下 n×m−2 个点中,选出 k−2 个点,与这两个点组成要选出的 k 个点),那么总的贡献就是 \(d×(n−d)×m^2×C_{n×m−2}^{k−2}\)

同理可以计算 y 坐标的贡献,得到最终答案为:

\((\sum_{d=1}^{n-1}d\times (n-d)\times m^2 +\sum_{d=1}^{m-1}d\times (m-d)\times n^2)\times C_{n \times m - 2}^{k-2}\)

代码

#include<bits/stdc++.h>using namespace std;using i64 = long long;const i64 mod = 1e9 + 7;i64 ksm(i64 x, int y) {i64 res = 1;while (y) {if (y & 1) res = res * x % mod;x = x * x % mod;y >>= 1;}return res;
}i64 C(int n, int m) {i64 res = 1;for (int i = 1; i <= m; i ++)res = res * (n - m + i) % mod * ksm(i, mod - 2) % mod;return res;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m, k;cin >> n >> m >> k;i64 ans = 0;for (int d = 1; d < n; d ++)ans = (ans + 1ll * d * (n - d) % mod * m % mod * m) % mod;for (int d = 1; d < m; d ++)ans = (ans + 1ll * d * (m - d) % mod * n % mod * n) % mod;ans = ans * C(n * m - 2, k - 2) % mod;cout << ans << '\n';return 0;
}

Friendships

题意

给你 n 个点,要你构造出 k 对距离为 2 的无向连通图,不能有自环和重边,如无法构造则输出 -1。

思路

距离为 2 的两个点中间必然会经过一个点,所以当拿出一个点作为所有距离为 2 的点对的中间点时,此时这个图的距离为 2 的点对达到最大值,也就是常说的菊花图。

image

通过菊花图可以得到最多 \(m = \frac{(n-1)\times(n-2)}{2}\) 个距离为 2 的对数,这也是一个无向连通图能得到最大距离为 2 的点数,因此当 k 大于这个值时,说明不可能构造出来,小于这个值的时候我们只需要添加 \(k-m\) 条边使得这些点连成环即可。

代码

#include<bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, k;cin >> n >> k;int all = (n - 1) * (n - 2) / 2;if (k > all) {cout << "-1\n";} else {cout << n - 1 + all - k << '\n';for (int i = 2; i <= n; i ++)cout << i << " 1\n";for (int i = 2; i <= n; i ++)for (int j = i + 1; j <= n; j ++) {if (all == k) return 0;cout << i << ' ' << j << '\n';all --;}}return 0;
}

Integer Cards

题意

给 n 个数和 m 次操作,每次操作给出 B、C 两个数,可以将数组中不大于 B (可以为 0 )个数修改成 C 的值,问最后这个 n 个数的和最大为多少。

思路

考虑离线做法,先将这 m 次操作处理出来,然后排序,这里因为map里自动排序了所以直接存进 bc 数组了,然后就是从 c 值大的往小的枚举,每次直接用一个multiset 处理可以被替换掉的数字即可,因为是从大到小的处理,所以复杂度不会有 \(O(n^2)\)

代码

#include<bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;multiset<int> s;vector<i64> a(n + 1);for (int i = 1; i <= n; i ++) {cin >> a[i];s.insert(a[i]);}vector<array<int, 2>> bc;map<int, int> mp;for (int i = 0; i < m; i ++) {int b, c;cin >> b >> c;mp[c] += b;}for (auto &[c, b] : mp) {bc.push_back({c, b});}for (int i = bc.size() - 1; i >= 0; i --) {auto [c, b] = bc[i];while (c > *s.begin() && b) {b --;s.erase(s.begin());s.insert(c);}}i64 ans = 0;for (auto i : s)ans += i;cout << ans << '\n';return 0;
}

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

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

相关文章

分布式事务最经典的七种解决方案

转载:后端 - 分布式事务最经典的七种解决方案 - 分布式事务 - SegmentFault 思否 随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题。 这篇文章首先介绍了相关的基础理论,然后…

江门数字化mes系统定制哪家好 珠海盈致mes系统服务商

对于江门数字化MES系统的定制服务,选择珠海盈致科技是一个不错的选择。珠海盈致科技是一家专业的智能制造解决方案提供商,具有丰富的数字化制造和MES系统定制经验。以下是选择珠海盈致科技的一些优势: 专业团队:珠海盈致科技拥有一支专业的团队,包括软件工程师、制造业专家…

python+anaconda环境搭建

一:下载安装 1、安装anaconda anaconda官网2、安装pycharm pycharm官网二:配置环境 1、找到anaconda安装位置在系统环境变量中添加如下信息打开DOS框,输入conda --version,出现如下信息说明配置成功三:创建虚拟环境 1、打开DOS框;输入(name表示自己虚拟环境的名称;versi…

Open-Sora1.2环境搭建推理测试

​引子 前阵子写了一篇Open-Sora1.0环境搭建&推理测试(Open-Sora1.0环境搭建&推理测试_自己搭建sora服务-CSDN博客,感兴趣的童鞋,请移步)。Open-Sora1.1发布的时候,撇了一眼新闻。后面一转头,忘记这个事情了。无意间翻到其开源网站上,发现2024.6.17发布1.2版本了…

04、组件介绍

k8s里的资源对象 在k8s里,yaml用来声明API对象的,那么API对象都有哪些? 可以这样查看资源对象 kubectl api-resources yaml使用缩进表示层次,缩进不允许使用tab,只能用空格,缩进空格数多少不要求,只要保证同一层级空格数一样多即可 使用 # 书写注释 数组(列表)是使用 …

代码随想录算法训练营第25天 | 491.递增子序列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。 数组中的整数范围是…

零基础 用unity做一款FPS射击游戏-下载安装unity(1)

【【Unity教程】零基础制作一个简单的FPS游戏案例-基于Unity2023】https://www.bilibili.com/video/BV1gH4y1575r?p=2&vd_source=5458d6a330cf989012a60998192e4cc2 这是我所看的教程 首先要下载Unity Hub(管理各种版本的unity) 进入 Unity官方下载_Unity最新版_从Unity …

离线安装tcpdump

链接:https://pan.baidu.com/s/1Jbos9YwIgt6oETmBA5lezQ 提取码:fwgj 检查gcc环境若无gcc环境 执行以下命令: tar -xvf gcc.tar cd gcc rpm -Uvh *.rpm --nodeps –forcem4包安装tar -xvf m4-1.4.19.tar.gz cd m4-1.4.19 ./configure make make installbison包安装tar -xvf …

关于苹果设备接力失效的处理办法

处理苹果设备接力无法使用的问题RT 简述 遇到该问题的原因可能有很多,甚至可能只是因为升级了一次系统。 网上有很多乱七八糟杂七麻八的办法,不可行,于是自己写一份做之后的留档。 关于这个问题已经咨询过了apple的客户支持部门,看起来他们也不知道该怎么做,试了一圈之后没…

当非遗遇上AI,简直美不可言!

本文由 ChatMoney团队出品 大家好,今天我要跟大家分享的是关于非遗与AI结合!我是用ChatmoneyAI-ChatAI聊天系统AI绘画制作的,你敢相信这些照片都是AI生成的吗?一、引言: 随着科技的飞速发展,传统文化与现代科技的融合愈发引人注目。最近,非遗与人工智能(AI)的奇妙结合…

Kutools-for-Excel学习版下载

一、软件介绍在处理 Excel 文件时,经常会遇到一些繁琐但又不可避免的操作,严重影响到文档编辑效率。Kutools for Excel 与 Excel 2007 / 2010 / 2013 / Microsoft 365 的界面完美融合,超过 300+ 的功能都提供了详细操作提示,即使是从未接触过的功能,也能立马上手使用,是你…

MRU算法实现

MRU(Most Recently Used)算法是一种缓存替换策略,与LRU(Least Recently Used)算法相反。MRU算法优先移除最近使用的缓存项,而保留较久未使用的缓存项。MRU算法适用于某些特定的访问模式,例如当数据访问具有较强的局部性时,MRU可能比LRU更有效。 基本原理 MRU算法的核心…