[JZOJ6299] 2019.08.12【NOIP提高组A】工厂
题目
题目大意
工厂内每个人只会操作一些机器。
他们会以随机的顺序来,每次选任意一台机器来操作。
一台机器只能由一个工人来操作。
可以花费一的代价来使某个工人学会一种机器。
问花费最少的代价,使得在所有的情况下每个人都能操纵一台机器。
正解
这题可以转化成个二分图。而答案一定满足:所有联通块都是个完全二分图。
我们要用最少的代价来造出这样的二分图。
预处理出所有的联通块,每个联通块用\((x,y)\)表示,意味着左边有\(x\)个,右边有\(y\)个。
于是就有了下面这个状压DP:\(f_{S,i}\)表示\(S\)集中的联通块都被使用了,其中完成了的联通块的\(x\)之和为\(i\)的最小边数。
等等,这个状态会不会存不下?
实际上,对于相同的\((x,y)\),我们只关心数量,所以可以进一步压缩。然后状态的数量就变得少了很多。
最后的答案记得要减去原来就有的边数。
代码
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 33
inline void update(int &x,int y){x>y?x=y:0;}
int n;
char can[N][N];
bool vis[N][2];
int cntl,cntr,have;
void find(int x,bool k){
vis[x][k]=1;
if (k==0){
cntl++;
for (int i=1;i<=n;++i)
if (can[x][i]=='1' && !vis[i][1])
find(i,1);
}
else{
cntr++;
for (int i=1;i<=n;++i)
if (can[i][x]=='1' && !vis[i][0])
find(i,0);
}
}
int sc[N][N];
struct State{
int x,y;
int num;
} lis[N];
int m;
int pro[N];
int chose[N];
int f[200000][N];
void dfs(int k,int s,int x,int y){
if (k>m){
if (s==0)
f[0][0]=0;
for (int j=0;j<n;++j){
if (x==y)
update(f[s][x],f[s][j]+(x-j)*(x-j));
for (int i=1;i<=m;++i)
if (chose[i]<lis[i].num)
update(f[s+pro[i-1]][j],f[s][j]);
}
return;
}
for (int i=0;i<=lis[k].num;++i){
chose[k]=i;
dfs(k+1,s+i*pro[k-1],x+i*lis[k].x,y+i*lis[k].y);
}
}
int main(){
freopen("factory.in","r",stdin);
freopen("factory.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;++i){
scanf("%s",can[i]+1);
for (int j=1;j<=n;++j)
if (can[i][j]=='1')
have++;
}
for (int i=1;i<=n;++i){
if (!vis[i][0]){
cntl=cntr=0;
find(i,0);
sc[cntl][cntr]++;
}
if (!vis[i][1]){
cntl=cntr=0;
find(i,1);
sc[cntl][cntr]++;
}
}
pro[0]=1;
for (int i=0;i<=n;++i)
for (int j=0;j<=n;++j)
if (sc[i][j]){
lis[++m]={i,j,sc[i][j]};
pro[m]=pro[m-1]*(sc[i][j]+1);
}
memset(f,127,sizeof f);
f[0][0]=0;
dfs(1,0,0,0);
printf("%d\n",f[pro[m]-1][n]-have);
return 0;
}
总结
居然还有如此鬼畜的DP……
[JZOJ6299] 2019.08.12【NOIP提高组A】工厂的更多相关文章
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- 2017.08.08【NOIP提高组】模拟赛B组
Summary 今天的题目也不算很难,唯一一道没做出来的题目是以前做过的,太不应该了. Problem T1 油滴扩展 题目大意 给你一堆点,你准备要在这么多的点当中滴油.你可以自己安排顺序,每次滴油 ...
- 2018.12.30【NOIP提高组】模拟赛C组总结
2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...
- NOIP提高组2004 合并果子题解
NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...
- [NOIP提高组2018]货币系统
[TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...
- NOIP提高组初赛难题总结
NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...
- 津津的储蓄计划 NOIp提高组2004
这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- 1043 方格取数 2000 noip 提高组
1043 方格取数 2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...
随机推荐
- undefined reference to `TTF_Init'
如果编译时遇上 undefined reference to `FunctionName' 或是这种类似错误,首先就得检查是不是函数名拼写错误,如果不是,那估计是编译时候有些链接库没加进去 比如这篇上 ...
- Markdown测试2
四级标题 内容测试 内容测试 内容测试 为知笔记发布博客时会添加一些HTML或CSS的标记,会影响文章的摘要显示. A B 一 二 α" role="presentation&q ...
- JS的面向对象与原型
原型 const yoshi = { skulk: true }; const hattori = { sneak: true }; const kuma = { creep: true }; ⇽-- ...
- CSS标准的书写顺序
- 关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录
一.一直对这个比较疑惑感觉只修改一条数据记录的一个字段结果更新Savechages后跟踪生成sql竟然是全部被修改,感觉微软怎么这么傻,总觉得会有其它方式可以只更新部分字段,但一直没有找到相关设置,最 ...
- 2018-9-30-dotnet-core-通过修改文件头的方式隐藏控制台窗口
title author date CreateTime categories dotnet core 通过修改文件头的方式隐藏控制台窗口 lindexi 2018-09-30 18:36:43 +0 ...
- jdk8中map新增的merge方法介绍
1.Map.merge方法介绍 jdk8对于许多常用的类都扩展了一些面向函数,lambda表达式,方法引用的功能,使得java面向函数编程更为方便.其中Map.merge方法就是其中一个,merge方 ...
- python redis 批量设置过期key
在使用 Redis.Codis 时,我们经常需要做一些批量操作,通过连接数据库批量对 key 进行操作: 关于未过期: 1.常有大批量的key未设置过期,导致内存一直暴增 2.rd需求 扫描出这些ke ...
- python学习笔记(十)——正则表达式和re模块
#正则表达式和re模块 # match(pattern, string,[flag]) #在字符串开始时进行匹配 # pattern 正则表达式 # string 要匹配的字符串 # [flag] 可 ...
- No identifier specified for entity: com.XXX.XXX...
这种情况一般是没有在属性上加@Id注解导致的. @Entity @Data @Table(name = "hl_role_module") public class RoleMod ...