BZOJ1482 : [Balkan2017]Cats
若猫和狗中至少有一个出现了$0$次,那么答案显然是$0$,否则若狮子出现了$0$次,那么显然无解。
那么现在至少有一个动物保持原地不同,其它动物恰好移动一次。
如果全部猫都不动而全部狗都动,那么可以贪心求出答案,最多移动一个狮子。
同理可以处理全部猫动而全部狗都不动的情况。
现在考虑同时存在猫和狗不动的情况,那么动的猫和狗一定是移动到不动的同类旁边,而狮子起到间隔作用。
设$f[i][j][k][S]$表示考虑前$i$个动物,目前手上剩余可以调控的狮子数为$j$(可以为负,表示后面的狮子往前动),下一个动物可以是$k$,不动的动物种类为$S$的最小移动次数,直接转移即可。
时间复杂度$O(n^2)$。
#include<cstdio>
const int N=5010,inf=1000000;
int Case,n,m,o,i,j,k,S,w,a[N],b[N],cnt[3],f[2][N*2][2][4],ans;
inline void up(int&a,int b){a>b?(a=b):0;}
int cal(int x){
int i,t=0;
for(i=1;i<=n;i++)if(a[i]!=(x^1))b[++t]=a[i];
for(i=1;i<t;i++)if(b[i]==2&&b[i+1]==2)return n-t;
if(b[1]==2||b[t]==2)return n-t;
return n-t+1;
}
int solve(){
scanf("%d",&n);
for(i=0;i<3;i++)cnt[i]=0;
for(i=1;i<=n;i++)scanf("%d",&a[i]),cnt[a[i]]++;
if(!cnt[0]||!cnt[1])return 0;
if(!cnt[2])return -1;
m=cnt[2];
up(m,n/2+5);
for(o=0,j=-m;j<=m;j++)for(k=0;k<2;k++)for(S=0;S<4;S++)f[0][j+N][k][S]=inf;
f[0][N][0][0]=f[0][N][1][0]=0;
for(i=0;i<n;i++,o^=1){
for(j=-m;j<=m;j++)for(k=0;k<2;k++)for(S=0;S<4;S++)f[o^1][j+N][k][S]=inf;
if(a[i+1]==0)for(j=-m;j<=m;j++)for(k=0;k<2;k++)for(S=0;S<4;S++)if(f[o][j+N][k][S]<inf){
w=f[o][j+N][k][S];
up(f[o^1][j+N][k][S],w+1);
up(f[o^1][j+N-(k==1)][0][S|1],w);
}
if(a[i+1]==1)for(j=-m;j<=m;j++)for(k=0;k<2;k++)for(S=0;S<4;S++)if(f[o][j+N][k][S]<inf){
w=f[o][j+N][k][S];
up(f[o^1][j+N][k][S],w+1);
up(f[o^1][j+N-(k==0)][1][S|2],w);
}
if(a[i+1]==2)for(j=-m;j<=m;j++)for(k=0;k<2;k++)for(S=0;S<4;S++)if(f[o][j+N][k][S]<inf){
w=f[o][j+N][k][S];
up(f[o^1][j+N+1][k][S],w+1);
up(f[o^1][j+N][0][S],w);
up(f[o^1][j+N][1][S],w);
}
}
ans=cal(0);
up(ans,cal(1));
for(k=0;k<2;k++)up(ans,f[o][N][k][3]);
return ans;
}
int main(){
scanf("%d",&Case);
while(Case--)printf("%d\n",solve());
return 0;
}
BZOJ1482 : [Balkan2017]Cats的更多相关文章
- Cats(4)- 叠加Free程序运算结果,Stacking monadic result types
在前面的几篇关于Free编程的讨论示范中我们均使用了基础类型的运算结果.但在实际应用中因为需要考虑运算中出现异常的情况,常常会需要到更高阶复杂的运算结果类型如Option.Xor等.因为Monad无法 ...
- Cats(3)- freeK-Free编程更轻松,Free programming with freeK
在上一节我们讨论了通过Coproduct来实现DSL组合:用一些功能简单的基础DSL组合成符合大型多复杂功能应用的DSL.但是我们发现:cats在处理多层递归Coproduct结构时会出现编译问题.再 ...
- Cats(2)- Free语法组合,Coproduct-ADT composition
上篇我们介绍了Free类型可以作为一种嵌入式编程语言DSL在函数式编程中对某种特定功能需求进行描述.一个完整的应用可能会涉及多样的关联功能,但如果我们为每个应用都设计一套DSL的话,那么在我们的函数式 ...
- Cats(1)- 从Free开始,Free cats
cats是scala的一个新的函数式编程工具库,其设计原理基本继承了scalaz:大家都是haskell typeclass的scala版实现.当然,cats在scalaz的基础上从实现细节.库组织结 ...
- 矩阵快速幂 POJ 3735 Training little cats
题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...
- 2015北京网络赛 A题 The Cats' Feeding Spots 暴力
The Cats' Feeding Spots Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acm ...
- [POJ 3735] Training little cats (结构矩阵、矩阵高速功率)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9613 Accepted: 2 ...
- (中等) CF 311B Cats Transport,斜率优化DP。
Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...
- Training little cats poj3735
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9299 Accepted: 2 ...
随机推荐
- gerrit原理
个人理解: 这个就是审核代码是否合理性的工具,一般是资深研发人工确认代码是否存在缺陷,通过发送邮件通知变化. 也可理解为这个是个git服务器,多一个代码审查的功能. 但是它是个web界面,方便管理 ...
- Spring.Net 简单实例-01(IOC)
1.话不多说看操作.新建"Windows窗体应用程序" 2:通过配置文件创建IOC容器 首先引入安装包 3:定义一个接口(更好的体现封装性,当然也可以直接使用类) 定义一个类,实现 ...
- Idea和PyCharm激活破解
1. 先去百度去官网下载专业版IDE, Idea 和PyCharm激活方法一样 2. 下载破解包, 点击下载 3. 将下载的jar包放到这个安装目录的bin目录下面 4. 在bin目录下面的文件pyc ...
- IEDA序列化设置
- python--使用递归优雅实现列表相加和进制转换
咦,好像坚持了一段时间,感觉又有新收获啦. # coding: utf-8 class Stack: def __init__(self): self.items = [] # 是否为空 def is ...
- 安装和强行卸载fuse
先卸载 yum list fuse yum --setopt=tsflags=noscripts remove fuse.x86_64 安装 yum install automake gcc-c++ ...
- rxjs简单入门
rxjs全名Reactive Extensions for JavaScript,Javascript的响应式扩展, 响应式的思路是把随时间不断变化的数据.状态.事件等等转成可被观察的序列(Obser ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-9项目各种全局帮助类
本文目录 1. 前沿2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装3.XmlHelper快速操作xml文档4.SerializationHe ...
- window下用taskkill杀死进程
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } ...
- HDU2732 Leapin' Lizards 网络流 最大流 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8362002.html 题目传送门 - HDU2732 题意概括 给你一个网格,网格上的一些位置上有一只蜥蜴,所有 ...