C. Tree Infection

Posted on 2022-04-11 16:58  ZheyuHarry  阅读(42)  评论(0编辑  收藏  举报

题目:

 

 

 

 

 

 

 

题目分析:

这道题是一个关于树的问题,我们已知一棵深度若干的健康的树,然后每秒能进行一次操作,操作分为两个内容,一个是spreading,是说一群兄弟节点中,只要有一个被感染了,每一秒这些兄弟节点之间就会被感染一个(注意,只是感染一个,而不是说每一个被感染的都可以去感染一下旁边的节点,不然就比较麻烦了这道题,要注意题目中说到的at most one child of vertex V,这个V是这一群兄弟的父节点),第二个操作就是注射,可以手动的给一个健康的节点变为被感染;

 

题解:这里要用到贪心的思路,因为我要让这棵树以最快的速度整体被感染,再看到我们的操作,每秒的注射是只有一个节点能被感染,而传播的话则没有上限,所以发挥感染的最大作用的是spreading,但是我们又可以因为题目的限制知道,一群兄弟节点每秒最多只有一个节点被传播感染,所以我们肯定要尽可能多的使更多的兄弟群体中存在被感染的,这就是inject的作用;

 

为了防止我还需要inject来感染那些没有被感染的兄弟节点时,前面的兄弟节点都已经感染完了,这就跟资本家剥削工人一样,资本家要高级技术工热门到不同的工厂去教会一般工人工作,那么就会让那些工作量大的先被教会,避免其他工厂都已经休假了,还在等着最后一个量很多的工厂工作;

 

所以这里关键的数据是每一群兄弟的兄弟个数,并且以之为根据进行降序排序,然后我就从上往下去一个个inject,我们把所有的都inject一遍称为一个周期,每个周期结束后,我们把那些工作量已经没了的工厂关掉,对剩下的工厂进行排序……直至所有工厂都被关掉!

 

那么我们就可以把inject和spread的过程封装成一个函数proc();

 

下面是代码:Submission #153156667 - Codeforces