【bzoj1149】【ctsc2007】【风铃】【dp】
来源:互联网 发布:老炮儿网络剧 编辑:程序博客网 时间:2024/05/17 06:53
Description
Input
Output
输出仅包含一个整数。表示最少需要多少次交换能使风铃满足Ike的条件。如果不可能满足,输出-1。
Sample Input
6
2 3
-1 4
5 6
-1 -1
-1 -1
-1 -1
2 3
-1 4
5 6
-1 -1
-1 -1
-1 -1
Sample Output
2
题解:这个题关键是看懂题。
首先要先判断是否可以满足。一遍dfs即可。统计一下最大深度和最小深度(算-1)。如果差值超过2就无解。
然后dp一下即可。
在dp的过程中如果发现有一棵子树的左右子树中中都既有最大深度又有最小深度。
那么显然是无解。
其他的话分情况讨论一下即可。
代码:
#include <cstdio>#include <cstdlib>#include <iostream>#define N 100010using namespace std;int n,maxx,minn(9999999),l[N],r[N],ans;void dfs(int x,int cnt){ if (x==-1){maxx=max(maxx,cnt);minn=min(minn,cnt);return;} dfs(l[x],cnt+1); dfs(r[x],cnt+1);}int slove(int x,int cnt){ int a,b; if (x==-1) { if (cnt==minn) return 1;else return 2; } a=slove(l[x],cnt+1); b=slove(r[x],cnt+1); if (a==1&&b==2||a==1&&b==3||a==3&&b==2) ans+=1; if (a==3&&b==3){printf("-1\n");exit(0);} return a|b;}void pre(){ dfs(1,0); if (maxx-minn>=2){printf("-1\n");exit(0);} if (maxx==minn){printf("0\n");exit(0);}}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&l[i],&r[i]); pre(); slove(1,0); printf("%d",ans);}
0 0
- 【bzoj1149】【ctsc2007】【风铃】【dp】
- 【BZOJ1149】【APIO2007】风铃(完全二叉树+dp)
- bzoj1149: [CTSC2007]风玲Mobiles
- bzoj1149: [CTSC2007]风玲Mobiles
- 【luogu3621】【APIO2007】风铃(树形DP)
- bzoj 1151: [CTSC2007]动物园zoo 状压dp
- 腾讯风铃
- 腾讯风铃
- 【ctsc2007】【挂缀】
- bzoj1149/2895 [JSOI2009]球队收益
- 【APIO】风铃(mobiles)
- 【NOI2005】【BZOJ1149】【vijos1834】瑰丽的华尔兹
- [CTSC2007]挂缀pendant
- 【贪心】【CTSC2007】【cogs1584】挂缀
- [CTSC2007]挂缀 解题报告
- 【CTSC2007】挂缀 贪心
- COGS 1584. [CTSC2007]挂缀
- [CTSC2007] 数据备份Backup
- java斐波那契数列
- jquery操作select
- ListView的listitem为EditText无法输入内容问题
- Linux常用命令(足以应付面试&转载)
- android 在Bitmap上进行绘图操作
- 【bzoj1149】【ctsc2007】【风铃】【dp】
- Andrew机器学习课程笔记(3)—— K均值、SVM、PCA
- Io 异常: The Network Adapter could not establish the connection 解决方法
- Linux下计算文件哈希值和文件比较
- Java数据库简介
- javascript中闭包
- MyEclipse8.5连接mysql数据库遇到的_SET问题
- erl_线性结构-Josephu(约瑟夫问题 )问题
- Java中集合框架(1)