cf round 423
A
题目要求
一家餐厅有n张一人桌 有m张双人桌
每次来一个人或者两个人
一个人首先选择坐在单人桌 若没有优先考虑都空的双人桌 最后考虑已有一个人的双人桌 都没有的话拒绝这个人
两个人考虑是否有都空的双人桌 若没有拒绝这2个人
输出一共拒绝了多少个人
参考AC代码
|
|
思路
模拟 aa表示有一个人的双人桌
B
题目要求
有一个矩形被W和B填空 问最少需要把多少个W换成B 可以满足所有的B构成一个矩形
参考AC代码
|
|
思路
模拟
算出B的最上方 最下方 最左方 最右方 以及B的总数cnt
利用这4个数值算出矩形的面积 减去cnt即可
注意如果矩形的边长大于n和m的最小值 则无法满足矩形输出-1
C
题目要求
给出若干个字符串s 以及该字符串在总最终字符串出现的次数以及位置
用子串去填空最终字符串
输出满足条件字典序最小的最终字符串
参考AC代码
|
|
思路
线段树单点更新
vis用来判断该区间是否全被修改过 若已修改则跳过该区间
ans里未更新的输出a满足字典序最小
D
题目要求
n个点 用最少的边连接 确保有k个度为1 其余n-k个点度大于1 要求最远点的距离最小
输出距离以及每条边的端点 多解输出一组即可
参考AC代码
|
|
思路
入度为1的点越多可以确保最远点的距离越小
ans存放边的情况 num记录每条路径最远点的数值 deep记录每条路径的深度 out记录每条路径最终的深度
先连接n-k个入度大于1的点 找到中心点n-k-1(-1是因为滚动数组点要从0开始 输出的时候+1)
利用滚动数组把0->center-1与center相连接 num和deep更新维护
之后把k个入度为1的点%k算出是哪条路径加上 更新num和deep 同时维护out
out由大到小排序后out[0]+out[1]即为所求
ans输出边