https://www.iai.sh.cn/contest 2022.04 银组,理论上 \(100+100+30+100\)。

T1 上锁的抽屉

题目描述

有一个抽屉柜里竖排了 \(n\) 只抽屉。每个抽屉有一把锁。若要把一只抽屉『锁死』,就必须锁上它自己,而且要把它的上一层抽屉也锁上。请问有多少种上锁的方法,可以恰好『锁死』 \(m\) 只抽屉?

由于答案可能很大,输出方案数模 \(10^9+7\) 的余数。

大体思路

计数类问题显然想到动态规划。

一般地,设 \(f[i,j]\) 表示前 \(i\) 个抽屉『锁死』\(j\) 个的方案数。这样,我们只需要对第 \(i\) 个抽屉上锁是否影响『锁死』的个数即可。

此时我们发现,这还取决于第 \(i-1\) 个抽屉是否上锁。因此,我们规定 \(f[i,j,0]\) 表示前 \(i\) 个抽屉『锁死』\(j\) 个,且第 \(i\) 个抽屉不上锁的方案数,\(f[i,j,1]\) 表示前 \(i\) 个抽屉『锁死』\(j\) 个,且第 \(i\) 个抽屉上锁的方案数。

当第 \(i\) 个抽屉上锁时,我们可以借助第 \(i-1\) 个抽屉上锁,则之前『锁死』的个数为 \(j-1\) 个;也可能第 \(i-1\) 个抽屉不上锁,则前 \(i-1\) 个需要『锁死』\(j\) 个。第 \(i\) 个抽屉不上锁时,必然完全依靠前 \(i-1\) 个抽屉『锁死』\(j\) 个,由此可得状态转移方程:

\[f[i,j,0]=f[i-1,j,1]+f[i-1,j,0]\\
f[i,j,1]=f[i-1,j-1,1]+f[i-1,j,0]\]

其边界条件为 \(f[1,1,1]=f[1,0,0]=1\),答案为 \(f[n,m,1]+f[n,m,0]\),注意取模。

这样,时空复杂度为 \(O(nm)\)。注意到 \(i\) 的决策只与 \(i-1\) 相关,可以使用滚动数组使得空间复杂度降至 \(O(m)\)。

ll n, m, f[2][maxn][2];
/*
f[i, j, 0] 表示前i个抽屉锁死j个,i不锁死
f[i, j, 1] ......................i锁死 f[1,0,0]=f[1,1,1]=1
f[i,j,0]=f[i-1,j,1]+f[i-1,j,0]
f[i,j,1]=f[i-1,j-1,1]+f[i-1,j,0]
(j > 0)
*/
int main () {
read(n); read(m);
f[1][0][0] = f[1][1][1] = 1;
rep(i, 2, n) {
rep(j, 0, i) {
f[i&1][j][0] = (f[(i-1)&1][j][1] + f[(i-1)&1][j][0]) % mod;
f[i&1][j][1] = f[(i-1)&1][j][0];
if(j > 0) (f[i&1][j][1] += f[(i-1)&1][j - 1][1]) %= mod;
}
}
writeln((f[n&1][m][0] + f[n&1][m][1]) % mod);
return 0;
}

T2 匹配括号(二)

题目描述

给定一个仅由 ()[] 构成的字符串,若它不是匹配的,请求出最少删去多少括号可以使它变成匹配的。匹配定义如下:

  • 空字符串是匹配的;
  • 如果字符串 \(s\) 是匹配的,那么 \((s)\) 与 \([s]\) 也是匹配的;
  • 如果字符串 \(s\) 与 \(t\) 都是匹配的,那么 \(st\) 也是匹配的。

大体思路

原题链接 https://loj.ac/p/10150

由于匹配的括号串每一个子串都匹配,考虑区间 DP。设 \(f[i,j]\) 表示区间 \([i,j]\) 最少删去的括号个数。边界 \(f[i,i]=1\)。

括号匹配是经典的讨论边界的区间 DP。如果 \(s_i,s_j\) 互相匹配,则有初始值 \(f[i,j]=f[i+1,j-1]\),否则初始为 \(\infty\)。然后枚举分割点 \(k\in [i,j)\),\(f[i,j]=\min\{f[i,k]+f[k+1,j]\}\)。最终答案即为 \(f[1,n]\),时间复杂度 \(O(n^3)\)。

T3 末日生存

题目描述

小爱正在参加一个末日生存比赛,每过一天要消耗一个单位的物资,最后一天到来之前,如果她没有物资,就输了。游戏一共要持续 \(d\) 天,出发前,小爱有 \(c\) 个单位的物资。

游戏过程中有 \(n\) 次补给机会,第 \(i\) 次补给机会在第 \(x_i\) 天 ,当天可以补给 \(a_i\) 个单位的物资。

请设计一个方案,使得小爱能够坚持到最后一天,且补给的次数最小。如果无论如何都到不了终点,输出 Impossible

大体思路

考场上没有思路,感觉和之前某个旅行商问题很像,但显然不一样。于是直接使用 \(dfs\),记 \(dfs(N,C)\) 表示到达第 \(N\) 个补给站时还有 \(C\) 的物资的次数,然后对第 \(N\) 个补给站是否补充物资进行讨论,时间复杂度 \(O(2^n)\),期望得分 \(30\)。

T4 狼人游戏

题目描述

有 \(n\) 个人在一起玩狼人游戏,游戏中有一些玩家的身份是狼人,剩下玩家的身份是平民。狼人知道彼此之间的身份,而平民对其他人的身份信息一无所知。

天亮时,每名玩家要指证另一名玩家是狼人。狼人一定会做伪证,指证某个平民为狼人,而平民可能指证某个狼人,也可能指证另一个平民。

给定每名玩家的指证对象,请分析场面上最多可能有多少名狼人?注意游戏规定至少需要有一名平民。

大体思路

原题 [COCI2014-2015#1] MAFIJA,正好做到过。

将指认关系进行连边,\(n\) 个节点 \(n\) 条边形成基环树(基环森林)。

用并查集维护环,对于每一个环,将其断开后变为一棵树,然后将这两个节点 \(u,v\) 分别作为根跑树形 DP 即可,答案累加 \(\max(f[u,0],f[v,0])\)。动态规划的复杂度为 \(O(n)\),总复杂度为 \(O(n\log n)\),瓶颈在于并查集。

此题由于所有点权均为 \(1\),还有 \(O(n)\) 的贪心做法,但由于推广性不强,在此不介绍。

/*
f[u][0]+=max(f[v][0], f[v][1])
f[u][1] = 1 + f[v][0]
max f[u][0], f[v][0]
*/
int n, id[maxn], f[maxn][2], ans;
int tot = 1, hd[maxn], ver[maxn * 2], nxt[maxn * 2];
inline void add(int u, int v) {
ver[++tot] = v; nxt[tot] = hd[u]; hd[u] = tot;
ver[++tot] = u; nxt[tot] = hd[v]; hd[v] = tot;
}
PII p[maxn]; // cir
bool vis[maxn * 2];
inline void dfs(int u, int fa) {
f[u][0] = 0, f[u][1] = 1;
for(int i = hd[u]; i; i = nxt[i]) {
int v = ver[i];
if(vis[i] || vis[i ^ 1] || v == fa) continue;
dfs(v, u);
f[u][0] += max(f[v][0], f[v][1]);
f[u][1] += f[v][0];
}
}
int fa[maxn];
inline int find(int k) {
return (k == fa[k] ? k : fa[k] = find(fa[k]));
}
int main () {
read(n);
rep(i, 1, n) fa[i] = i;
rep(u, 1, n) {
int v; read(v);
add(u, v);
int f1 = find(u), f2 = find(v);
if(f1 != f2) fa[f1] = f2;
else {
id[++id[0]] = tot;
p[id[0]] = {u, v};
}
}
rep(i, 1, id[0]) {
int u = p[i].first, v = p[i].second;
vis[id[i]] = vis[id[i] ^ 1] = 1;
dfs(u, 0);
int tmp = f[u][0];
dfs(v, 0);
ans += max(tmp, f[v][0]);
vis[id[i]] = vis[id[i] ^ 1] = 0;
}
writeln(ans);
return 0;
}

YACS-2022.4-银组的更多相关文章

  1. usaco 2010年3月银组题解

    usaco银组解题报告 一.石子游戏如果把‘O’当作0,‘X’当做1,则N个洞的每一种状态都可以看做是一个N位二进制数.于是,这个问题就变成了求环绕的N位格雷码.幸运的是,这个结构很容易就能够用一个简 ...

  2. BZOJ USACO 银组 水题集锦

    最近刷银组刷得好欢快,好像都是水题,在这里吧他们都记录一下吧(都是水题大家一定是道道都虐的把= =)几道比较神奇的题到时再列出来单独讲一下吧= =(其实我会说是BZOJ蹦了无聊再来写的么 = =) [ ...

  3. USACO 2014 FEB 银组

    1.自动打字{Silver题1} [问题描述] 贝西新买了手机,打字不方便,请设计一款应用,帮助她快速发消息. 字典里有W(W<=30000)个小写字母构成的单词,所有单词的字符总数量不超过1, ...

  4. 【Usaco2014Open银组】双导航(gpsdual)

    题目 [题目描述] FJ 最近网购了一台小车.但是由于他的草率,在选择加装物品时偶然地点击了两次"Submit" ,结果最后他的小车装了两台GPS 导航系统!更糟的是,这两个系统对 ...

  5. USACO[19-20]Dec银组题解

    1,MooBuzz 这题其实是道数学题. 我们先找找符合要求的数:1,2,4,7,8,11,13,14…… 我们发现再往后找都是这8个数中的一个加15k如:16……19……29…… 找规律发现k=n/ ...

  6. 2022.2.26A组总结&反思

    今天的发挥比较奇妙.. T1:一眼dp+高斯消元,但是感觉细节比较多,然后先去做了T2,写完后回来推了一下就做出来了.比较裸,但是细节确实多,但是很可惜的一点是最后提交的代码没有判不合法,到手的100 ...

  7. noip2015 提高组 解题报告

    完美退役...说好的不卡常呢QAQ day1: T1:模拟题?..考察选手将题目描述翻译成代码的能力233 //其实真相是考验rp..论代码雷同的危害233 T2:简单图论,每个点出度为1所以是基环内 ...

  8. 要立刷金组flag了T_T

    刷了那么多银组,发现自己好多不会啊... 果然太弱 在这感谢hzwer神犇的blog.. 大部分题解都从黄学长这里来orz. orz.... 果然我太水

  9. bzoj1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏

    金组题什么的都要绕个弯才能AC..不想银组套模板= = 题目大意:给n个点,求最小边长使得此正方形内的点数不少于c个 首先一看题就知道要二分边长len 本来打算用二维前缀和来判断,显然时间会爆,而且坐 ...

随机推荐

  1. 如何修改windows Server 2012 远程桌面连接默认端口

    如何修改windows Server 2012 远程桌面连接默认端口   修改windows 2012/win8.win7远程桌面连接默认端口一般需要修改注册表四个地方[HKEY_LOCAL_MACH ...

  2. 软件工程homework-003

    软件工程第三次作业 博客信息 沈阳航空航天大学计算机学院2020软件工程作业 作业要求 软件工程第三次作业 课程目标 熟悉一个"高质量"软件的开发过程 作业目标 熟悉代码规范及结对 ...

  3. MySQL 字符集相关

    为了支持各个国家的不同语言,MySQL 从4.0 版本开始支持了很多种字符集,且每种字符集支持了 N 多种排序规则.我们可以在建表的时候指定字符集的排序规则,不指定时会有一个默认规则. 字符集和排序规 ...

  4. python+pytest接口自动化(9)-cookie绕过登录(保持登录状态)

    在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理:再者,每次请求接口 ...

  5. dotnet 委托的实现解析(2)开放委托和封闭委托 (Open Delegates vs. Closed Delegates)

    前言 这是个人对委托的理解系列第二篇,部分翻译自 Open Delegates vs. Closed Delegates – SLaks.Blog,好像还没人翻译过,加上部分个人理解.希望能对大家理解 ...

  6. Shell:常见错误总结(一)

    Blog:博客园 个人 译自BashPitfalls 本文总结了编写Shell脚本中的常见错误. for f in $(ls *.mp3) 最常犯的错之一就是编写这样的循环: for f in $(l ...

  7. CF786B/CF787D Legacy

    题目描述: luogu cf cf 题解: 最短路+线段树优化建图. 考虑本题的边是点->点.段->点和点->段,我们可以建线段树然后拆成入点和出点. 入点:儿子->父亲,边权 ...

  8. Ubuntu下交换Alt和Ctrl (适用于任何按键修改)

    在 Ubuntu 下交换Alt和Ctrl键: sudo vim /usr/share/X11/xkb/keycodes/evdev 或者用系统默认编辑器打开: sudo xdg-open /usr/s ...

  9. 12.16 JAVA swing

    ------------恢复内容开始------------ 12.16JAVA swing 1.框架 JFrame>JPanel>组件JButton JTestfilled JTable ...

  10. 什么叫 CC 攻击?什么叫 DDOS 攻击?

    CC 攻击,主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使你的系统资源消耗殆尽.DDOS 攻击,中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一 ...