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)的更多相关文章

  1. 【做题】Codeforces Round #436 (Div. 2) F. Cities Excursions——图论+dfs

    题意:给你一个有向图,多次询问从一个点到另一个点字典序最小的路径上第k个点. 考虑枚举每一个点作为汇点(记为i),计算出其他所有点到i的字典序最小的路径.(当然,枚举源点也是可行的) 首先,我们建一张 ...

  2. 【做题】Codeforces Round #429 (Div. 2) E. On the Bench——组合问题+dp

    题目大意是给你n个数,求相邻两数相乘不是完全平方数的排列数. 一开始看到这题的时候,本人便想给相乘为完全平方数的数对建边,然后就写萎了... 后来通过集体智慧发现这个重要性质:对于自然数a,b,c,若 ...

  3. 【做题】Codeforces Round #453 (Div. 1) D. Weighting a Tree——拆环

    前言:结论题似乎是我的硬伤…… 题意是给你一个无向图,已知连接到每一个点的边的权值和(为整数,且属于区间[-n,n]),需要求出每条边权值的一个合法解(都要是在区间[-2*n^2,2*n^2]内的整数 ...

  4. 套题: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 ...

  5. DP刷题记录

    目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...

  6. 刷题记录:Codeforces Round #724 (Div. 2)

    Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...

  7. 刷题记录:Codeforces Round #739 (Div. 3)

    Codeforces Round #739 (Div. 3) 20210907.网址:https://codeforces.com/contest/1560. --(叹). A 不希望出现带" ...

  8. 刷题记录:Codeforces Round #725 (Div. 3)

    Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...

  9. 刷题记录:Codeforces Round #719 (Div. 3)

    Codeforces Round #719 (Div. 3) 20210703.网址:https://codeforces.com/contest/1520. 没错,我是个做div3的蒟蒻-- A 大 ...

随机推荐

  1. django框架6

    内容概要 神奇的双下划线查询 外键字段的创建 外键字段操作 多表查询 基于对象的跨表查询 基于双下划线的跨表查询 双下线查询扩展 如何查看SQL语句 内容详情 神奇的双下划线查询 1.查询年龄大于20 ...

  2. Tarjan算法模板(USACO03FALL受欢迎的牛)

    好文章 #include<bits/stdc++.h> using namespace std; const int N = 10010, M = 50010; int n, m; int ...

  3. windows和linux系统下测试端口连通性的命令

    0. ping 1. telnet 2. ssh 3. curl 4. wget 5. tcping 6. 总结 本文地址: https://www.cnblogs.com/hchengmx/p/12 ...

  4. shell 问题记录

    工作中写了个 RestAPI 接口,然后想通过 crontab 任务,去定时调用接口.发现去拼接 post 请求真的不容易.对于单引号,双引号的使用.很懵,示例代码如下:对于 '$line' 处,单引 ...

  5. 全新升级的AOP框架Dora.Interception[3]: 基于特性标注的拦截器注册方式

    在Dora.Interception(github地址,觉得不错不妨给一颗星)中按照约定方式定义的拦截器可以采用多种方式注册到目标方法上.本篇文章介绍最常用的基于"特性标注"的拦截 ...

  6. Mac安装Brew包管理系统

    Mac安装Brew包管理系统 前言 为什么需要安装brew 作为一个开发人员, 习惯了使用centos的yum和ubuntu的apt, 在mac中有没有这两个工具的平替? 有, 就是Brew. Bre ...

  7. tomcat 的安全配置预防后台被攻击

    安全是系统架构中最重要的关注点之一,通常情况下,所说的安全涵盖网络安全.数据安全.操作系统安全.服务器安全以及应用系统安全等诸多方面. Tomcat 是一个免费的开放源代码 的Web应用服务器,技术先 ...

  8. 一个紧张刺激的聊天器,要不要进来看看(Python UDP网络模型)

    先来哔哔两句:(https://jq.qq.com/?_wv=1027&k=QgGWqAVF) 互联网的本质是什么?其实就是信息的交换.那么如何将自己的信息发送到其他人的电脑上呢?那就需要借助 ...

  9. Java:如何打印整个字符串数组?

    例: public static void main(String[] args) { String prodName = "雇员姓名,雇员唯一号"; String[] prodN ...

  10. Netty 如何高效接收网络数据?一文聊透 ByteBuffer 动态自适应扩缩容机制

    本系列Netty源码解析文章基于 4.1.56.Final版本,公众号:bin的技术小屋 前文回顾 在前边的系列文章中,我们从内核如何收发网络数据开始以一个C10K的问题作为主线详细从内核角度阐述了网 ...