BUPT2017 wintertraining(15) #4H

Gym - 101116K

题意

给定一个菜谱,大写的单词代表混合物,小写的代表基础原料。每个混合物由其它混合物或基础原料组成,不会间接或直接地需要自己。制备每个混合物必须先制备组成它的混合物。且混合物都要用一个碗装,当它作为原料去合成其它混合物后,碗就空出来了。求合成第一个混合物最少需要用几个碗。

题解

假设合成一个混合物需要dfs(i)个碗。

因为最后需要合成第一个混合物,所以我们以它为根进行dfs。

假设当前混合物的原料里有t个混合物,其中第j个合成的混合物需要need[j]个碗,且还要j-1个碗装前面j-1个混合物,因此此时需要j-1+need[j]个碗。

因此我们把need按从大到小排序,求出合成子混合物时所需的最大碗数,最后混合成当前混合物需要t+1个碗,取两者最大值即可。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define N 1005
using namespace std;
struct node{
char name[25];
char son[15][25];
int d;
}a[N];
int n;
int s[N];
bool cmp(int a,int b){
return a>b;
}
int dfs(int x){
int t=0,need[15];
memset(need,0,sizeof need);
for(int j=1;j<=a[x].d;j++)
if(a[x].son[j][0]>='A'&&a[x].son[j][0]<='Z'){
t++;
for(int i=1;i<=n;i++)if(strcmp(a[i].name,a[x].son[j])==0){
need[t]=s[i]?s[i]:dfs(i);
break;
}
}
sort(need+1,need+1+t,cmp);
int ans=t+1;
for(int j=1;j<=t;j++){
ans=max(j-1+need[j],ans);
}
return s[x]=ans;
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s%d",a[i].name,&a[i].d);
for(int j=1;j<=a[i].d;j++)
scanf("%s",a[i].son[j]);
}
printf("%d\n",dfs(1));
return 0;
}

【 Gym 101116K 】Mixing Bowls(dfs)的更多相关文章

  1. 【POJ - 3984】迷宫问题(dfs)

    -->迷宫问题 Descriptions: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0 ...

  2. 【POJ - 1321】棋盘问题 (dfs)

    棋盘问题 Descriptions: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘 ...

  3. 【POJ - 1970】The Game(dfs)

    -->The Game 直接中文 Descriptions: 判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标:没有胜者输出0.棋盘是这样的,如图 Samp ...

  4. 【 Gym - 101124E 】Dance Party (数学)

    BUPT2017 wintertraining(15) #4G Gym - 101124 E.Dance Party 题意 有c种颜色,每个颜色最多分配给两个人,有M个男士,F个女士,求至少一对男士同 ...

  5. 【 Gym - 101138F 】GukiZ Height (数学)

    BUPT2017 wintertraining(15) #4 C Gym - 101138F 题意 初始高度0,目标值h,第i天目标值会下降i,当前高度会改变a[i%n],求高度不小于目标值的最早的时 ...

  6. 【Gym - 100812G 】Short Path (SPFA)

    BUPT2017 wintertraining(15) #7B 题意 n个点m条无向有权边(2 ≤ n ≤ 10^5, 1 ≤ m ≤ 10^5),每个点标记了0或1,求所有1中,最近的两个1的下标及 ...

  7. 【Gym - 101002F】Mountain Scenes(dp)

    Mountain Scenes Descriptions 给你一个长度为n的丝带,一个宽w一个高h 的 格子,用丝带去填充格子,这填充后只需要满足至少有一列的丝带长度与其他格子不同即可.丝带可以不全部 ...

  8. 【Win10 UWP】QQ SDK(二):SDK的回调处理

    上一讲,我们介绍了QQ SDK的使用方法,请看<[Win10 UWP]QQ SDK(一):SDK基本使用方法> 一. 回调的基本形式 从前面的介绍中我们知道,我们的应用和QQ客户端之间需要 ...

  9. 【Win10 UWP】QQ SDK(一):SDK基本使用方法

    每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...

随机推荐

  1. vue-用Vue-cli从零开始搭建一个Vue项目

    Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...

  2. Vue-认识状态管理vuex

    vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试,可以多个组件共享状态.简单来说,就是共享的状态用state来存放,用mutations来操作state,但是 ...

  3. .Net Core 系列之一 hello world

    OS: win10 企业版 中文环境 .Net Core: 切记不要装64版本,否则可能会出现vs2017无法生成.net core 2.0的项目 dotnet-sdk-2.0.0-win-x86.e ...

  4. 从github checkout子文件夹

    1.将远程项目加载到指定目录:$git init; $git remote add -f origin url2.使用SparseCheckout模式:$git config core.sparsec ...

  5. Caffe源码中caffe.proto文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个 ...

  6. REST-framework快速构建API--源码解析

    一.APIView 通过APIView实现API的过程如下: urls.py url(r'^books/$', views.BookView.as_view(),name="books&qu ...

  7. json中获取key值

    <script type="text/javascript"> getJson('age'); function getJson(key){ var jsonObj={ ...

  8. Centos下分布式跟踪工具Pinpoint的完整部署记录

    一.Pinpoint简单介绍Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统.分布式跟踪系统.一般来说,前端向后台发起一个查询请求,后台服务可能 ...

  9. PairProject——结对编程

    成员:12061162  王骜 12061225  钟毅恒 一.合作过程中的照片 . 二.结对编程的优缺点 优点: 1)在编程过程中,任何一段代码都不断地复审,同时避免了将写代码的责任抛给一个人的问题 ...

  10. final个人阅读作业

    一.软件工程M1/M2总结 1.M1阶段总结: 我们团队的软件工程开发是按照前后端来分别开发的,我是负责后端的.我们的项目是做一个北航的社团平台,是一个网站.在后端我们使用的是ruby on rail ...