| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Codeforces Global Round 19(A~D) -> 正文阅读 |
|
[数据结构与算法]Codeforces Global Round 19(A~D) |
万年补题怪~ A.?https://codeforces.com/contest/1637/problem/A 题意: 给定一个长度为n的数数组,从1到n-1里随便选一个数字当做len 分析:其实就是检查数组是不是升序 AC Code:
B.?https://codeforces.com/contest/1637 题意: 给定长度为n的数组 定义:每一个子序列分成k段,则这个子序列的价值为k+MEX(子序列元素)。 求所有子序列的价值和的最大值 分析: 上一次cf的MEX问题就把我整的够呛,这次看了半天题才看懂,理解不了英语。。。 首先: 要想价值最大,肯定每一个元素分成一段是最优的 所以如果一个元素是0,贡献的价值就是1 +MEX0? = 2; 如果是其他元素,贡献的价值就是1 + 0 = 1 然后想代码: 我的最后一步要求的是所有子序列的价值总和,那就是多次的1和2相加,为了避免重复计算,就可以直接在输入的时候把a[i]改为它能贡献的价值。 至于最后的优化: 既然是所有子序列,那么每个元素出现的次数是跟位置有固定关系的,根据结论直接在输入时求和也未尝不可,也就是sum += 贡献价值*出现次数,这样会免去n^3的子序列遍历 代码就不写了~ C.?https://codeforces.com/contest/1637/problem/C 题意: 给定一个长度为n的数组,进行操作:选定i<j<k, a[j]>=2, a[j] 减2,a[i]和a[k]加一 问:最少进行多少次这样的操作能够将除首尾之外的数组元素全部变成0,如果无法实现就输出-1 分析: 先想最简单的 中间有一个偶数,那么我可以将i,k指向a[1]和a[n],然后经过a[j]/2次操作将a[j]变为0 如果是一个奇数,那我先要将它充当i或者k,把它先变为偶数。 也就是说,除去首尾元素,每个元素贡献的次数是:奇数,(a[i]+1)/2; 偶数a[i]/2; 推导之后可以得到res = (sum + cnt) /2; sum为除首尾元素之外的元素和,cnt为奇数个数 特殊情况 中间的数字全部为1,无法进行操作,输出-1 只有3个元素,中间的元素是个奇数,不管怎么操作奇数还是奇数,输出-1 AC Code:
D.??https://codeforces.com/contest/1637/problem/D 题意: 给定两个长度为n的数组,可以执行任意次数交换ai和bi的操作,最后要使得题目所给公式结果最小,输出最小结果 分析: 观察给出的式子: 也就是说问题变成了:交换元素之后,使得两数组各自元素和的平方相加值最小 所以需要穷举出所有元素和可能的值,然后去找最小值,相当于一个背包问题,我写成递归直接就炸了 石头要不要? 像这种题以我的水平比赛正常是写不出来的,膜佬~ AC Code:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 17:48:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |