刷题记录:Codeforces Round #734 (Div. 3)
Codeforces Round #734 (Div. 3)
20210920。网址:https://codeforces.com/contest/1551。
编程细节:下标定义不要一会[1,n]一会[0,n)啊…
A
用价值为1的硬币a枚+价值为2的硬币b枚,买价值为n的东西,希望ab之差的绝对值尽量小。大水题。
B1
给我们一个字符串s,用红色和绿色给s上色,规则如下:
- 一个字母或者不上色,或者被涂成一种颜色,即不能又红又绿。
- 被涂成一种颜色的所有字母,必须两两不相同。
- 红色字母数量=绿色字母数量。
- 这种涂色方法会得到最多的上色字母。
问我们涂成红色的字母有多少个。
做法:记录每个字母的数量。如果某字母数量≥2,分配一个到红色、一个到绿色、剩下都不上色。如果==1,分配它到目前比较少的颜色。上完色之后,红色数量不一定等于绿色数量,但最多差1,所以输出两个数量中较小的那个。
B2
给我们一个整数序列a1~an,用k种颜色给它们上色,规则如下(和B1差不多):
- 一个整数或者不上色,或者被涂成一种颜色。
- 被涂成一种颜色的所有数值,必须两两不相同。
- 被涂成每一种颜色的数字数量都相等。
- 这种涂色方法会得到最多的上色数字。
让我们输出上色方案(而不是简单给出涂色数量)。
做法:
- 在读入整数序列的时候,用三元组(数值大小,位置,颜色)来记录序列信息,颜色都初始化为不上色。
- 然后按数值大小排序,统计每一个数值有多少个数。
- 如果某数值个数≥k,则每个颜色分配一个数,剩下不上色;
- 累加【个数<k的数值】的数量,除k得到【这些零散的数能够把k种颜色全部使用几次】,再乘k就是【零散数值的上色次数】。这一步是为了保证【每一种上色的数量都相等】。
- 接下来我们对【个数<k的数值】进行上色,每上一次色就--【零散数值的上色次数】。把每一个数分配到目前数量最少的颜色。
- 最后我们按照位置对序列进行排序,然后输出每个数的颜色。
C
给我们一堆用abcde组成的词语,选取最大数量的词语来写小说,使得某一字母出现次数>其他4个字母出现次数的和。输出这个最大数量。
(给出的词语可能重复。词语不能重复使用。)
做法:
- 读入词语,记录该词语的【a数量-bcde数量、b数量-acde数量、…、e数量-abcd数量】这5个值。
- 接下来,我们希望小说中【a数量>bcde数量】,因此对词语按【a数量-bcde数量】从大到小进行排序,在满足【a数量>bcde数量】的情况下逐个选取,就是贪心法。记录这种选取的数量。
- 然后,我们希望【b数量-acde数量】,如法炮制。遍历5种情况,对5种情况的答案取max。
D
给我们n*m(n行m列)的棋盘,保证n*m是偶数。给我们n*m/2个牌,每一个牌都是日字形的,可以横着放可以竖着放。问我们,能不能用这些牌摆满棋盘,使得横着放的牌恰好有k块。如果能的话,输出摆法。
做法:
- 首先我们希望棋盘的列数是偶数(为了构造方便),如果不是就把棋盘转90°,然后k=n*m/2-k;
- 接下来,我们像图1这样初始化棋盘。就是说,如果行数是偶数,就像前4行那样铺满棋盘。如果行数是奇数,最后一行像第5行那样横着铺满;最后一行有(列数)/2个横放的牌,这是最少的横放牌数,如果给出的k比这个数目小,输出NO。
- 看图2——我们可以像图2这样,通过扭转操作增加横放牌的数量。因为每次只能增加2个横放的牌,所以,若【k-最小横放牌数目】不是偶数,也输出NO。
- 然后,我们从左上开始一行一行遍历,一个单元一个单元地扭转,直到横放牌数符合要求。
- 编程细节:为了保证输出结果中,牌的字母不相撞,可以像图3这样初始化牌的字母。

E
给我们一个整数序列a1~an。【一个move】的意思是删掉一个数,如23415删掉3变成2415。我们希望做尽可能少的move,使得出现≥k个【数值=下标】的数。输出最少的move次数;如果做不到【通过move操作得到≥k个数值=下标的数】,输出-1。
思路是dp。用dp[i][j]表示,考虑前i个数,其中有j个数没有被move掉,含有【数值=下标】的数的最大数量。我们从n到0枚举j,dp[n][j]即为n-j次move后得到的【数值=下标】最大数量,一旦dp[n][j]≥k,就break输出n-j。
如何得到dp[i][j]呢?我们考虑第i个数,第i个数被move掉的情况下,有dp[i][j]=max(dp[i][j],dp[i-1][j])。第i个数没有被move掉的情况下,有dp[i][j]=max(dp[i][j],dp[i-1][j-1]+(a[i]==j?1:0)),最后那个?:用来考察第i个数是否【数值=下标】。外层循环是i从0到n-1,内存循环是j从0到i,就得到dp了。
……(叹)。
F
给我们一棵n个顶点的树和一个整数k,让我们选k个顶点,要求这k个顶点两两之间距离相等,问有多少种选法。(看完题目我就直接放弃思考去看题解了…)
首先,对于k=2的情况,输出n*(n-1)/2,任意两个顶点都可以。(注意特判!)
然后,对于k=3的情况,3个顶点一定是星型结构的。即,设这三个顶点为ABC,它们一定都与一个顶点Q连接,QA距离=QB距离=QC距离。
解释:如果ABC两两连接的路径都没有公共顶点,则从A到B可以通过AB路径,也可以通过AC+CB路径,此时产生了环,不符合树的定义。那么,如果AB和AC有公共顶点Q,但BC不通过Q,也会出现同样的问题,从B到C可以走BC也可以走BQC。所以,为了【顶点之间只有一条通路】,3个顶点需要是星型结构的。
接下来,对于k≥3的情况,我们拿4个顶点ABCD出来。设ABC的中心节点是Q,BCD的中心节点是P,如果P和Q不是同一个顶点,则从B到C可以走BQC也可以走BPC,又出现了环。我们固定ABC,遍历剩下k-3个顶点作为D,就可以得到一个很强的结论:这k个顶点都是星型结构的。
做法:
- 我们考虑第r个顶点(最外层循环是从1到n遍历r),以r为树根把树悬挂起来。设与r紧邻的顶点(即第一层顶点)个数为QL,QL也是子树的个数。只有同一层的节点才能互相匹配,得到两两距离相等的星型结构。因此,我们逐层向下考虑,用数组cnt[QL]来记录某一层每个子树的节点个数,计算完这一层后就把cnt更新成下一层的节点个数。
- 一开始我们把cnt全初始化为1(第一次节点)。这样更新cnt:对每一个子树维护一个set,set里面存放该子树该层的节点。更新的时候,首先声明一个名为temp的新set,然后对set里的每一个节点,遍历它的邻居,如果邻居是“未使用的”,则把它放进temp;遍历完这个节点的邻居后,把这个节点标记为“使用过的”,--对应的cnt。遍历完该子树的set里的所有节点后,清空set,把temp里的节点转移到set里,每转移一个就++cnt。(一开始要把树根r标记为使用。)
- 对于给定的cnt,求大小为k星型结构个数:使用dp。设dp[i][j]为【只考虑前i个子树时,大小为j星型结构的个数】。状态转移方程是这样的:
dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*cnt[i],即【不使用第i个子树】+【使用第i个子树】。外层循环是i从1到QL,内层循环是j从1到k,dp[n][k]即为所求。编程细节:dp初始化为0,但dp[x][0]需要全赋值为1。
刷题记录:Codeforces Round #734 (Div. 3)的更多相关文章
- 【做题】Codeforces Round #436 (Div. 2) F. Cities Excursions——图论+dfs
题意:给你一个有向图,多次询问从一个点到另一个点字典序最小的路径上第k个点. 考虑枚举每一个点作为汇点(记为i),计算出其他所有点到i的字典序最小的路径.(当然,枚举源点也是可行的) 首先,我们建一张 ...
- 【做题】Codeforces Round #429 (Div. 2) E. On the Bench——组合问题+dp
题目大意是给你n个数,求相邻两数相乘不是完全平方数的排列数. 一开始看到这题的时候,本人便想给相乘为完全平方数的数对建边,然后就写萎了... 后来通过集体智慧发现这个重要性质:对于自然数a,b,c,若 ...
- 【做题】Codeforces Round #453 (Div. 1) D. Weighting a Tree——拆环
前言:结论题似乎是我的硬伤…… 题意是给你一个无向图,已知连接到每一个点的边的权值和(为整数,且属于区间[-n,n]),需要求出每条边权值的一个合法解(都要是在区间[-2*n^2,2*n^2]内的整数 ...
- 套题:Codeforces Round #194 (Div. 1) (2/5)
A. Secrets http://www.cnblogs.com/qscqesze/p/4528529.html B. Chips http://www.cnblogs.com/qscqesze/p ...
- DP刷题记录
目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...
- 刷题记录:Codeforces Round #724 (Div. 2)
Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...
- 刷题记录:Codeforces Round #739 (Div. 3)
Codeforces Round #739 (Div. 3) 20210907.网址:https://codeforces.com/contest/1560. --(叹). A 不希望出现带" ...
- 刷题记录:Codeforces Round #725 (Div. 3)
Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...
- 刷题记录:Codeforces Round #719 (Div. 3)
Codeforces Round #719 (Div. 3) 20210703.网址:https://codeforces.com/contest/1520. 没错,我是个做div3的蒟蒻-- A 大 ...
随机推荐
- CabloyJS部署了一套演示站点
为了方便大家快速体验和了解CabloyJS的风格和特性,全新部署了一套演示站点.对于初次接触CabloyJS的开发者,不用下载新建项目,就可以直接体验CabloyJS了 在线演示 场景 链接/二维码 ...
- Linux系列之linux访问windows文件
Linux永久挂载windows共享文件 Linux系统必须安装samba-client Linux服务器必须能访问到Windows的共享文件服务的(445端口) 1.Windows共享文件 2.测试 ...
- call apply bind的作用及区别? 应用场景?
call.apply.bind方法的作用和区别: 这三个方法的作用都是改变函数的执行上下文,换句话说就是改变函数体内部的this指向,以此来扩充函数依赖的作用域 1.call 作用:用于改变方法内部的 ...
- VueX的模块你知道多少?
为什么会出现VueX的模块呢?当你的项目中代码变多的时候,很难区分维护.那么这时候Vuex的模块功能就这么体现出来了. 那么我们就开始吧!一.模块是啥? /* eslint-disable no-un ...
- js 表面学习 - 认识结构2
单行注释以 // 开头. 多行注释以 /* 开头,以 */ 结尾. 任何位于 /* 和 */ 之间的文本都会被 JavaScript 忽略. JavaScript 数据类型 JavaScript 变量 ...
- 说什么也要脱单——Python WEB开发:用Tornado框架制作简易【表白墙】网站
先来哔哔两句:(https://jq.qq.com/?_wv=1027&k=QgGWqAVF) 今天我们要用Python做Web开发,做一个简单的[表白墙]网站.众所周知表白墙的功能普遍更多的 ...
- 初学python常用,python模块安装和卸载的几种方法
兄弟们常常因为遇到模块不会安装,或者遇到报错就懵了,就很耽误学习进度,今天我们就一次性了解Python几种安装模块的方法~不过~ 实在是懒得看 点击此处找管理员小姐姐手把手教你安装 一.命令提示符窗口 ...
- Nacos开机自启
1.添加nacos.service文件 vi /lib/systemd/system/nacos.service 2.将以下内容写到nacos.service文件中 ps:我的nacos路径是/usr ...
- CVPR 2017:See the Forest for the Trees: Joint Spatial and Temporal Recurrent Neural Networks for Video-based Person Re-identification
[1] Z. Zhou, Y. Huang, W. Wang, L. Wang, T. Tan, Ieee, See the Forest for the Trees: Joint Spatial a ...
- 零基础学Java(9)在mac上运行命令行提示"找不到或无法加载主类"
天坑 遇到的问题:使用命令行执行命令:java EightSample,会报以下错误 错误: 找不到或无法加载主类 EightSample 运行环境 mac系统 IntelliJ IDEA编译器 Ja ...