码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #386(div 2)

时间:2017-01-09 00:39:42      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:等于   round   处理   思维   end   更改   分析   表示   节点   

A

=w=

B

QAQ

C

^o^

D

题意:小明要和a+b杯茶共n杯,有绿茶a杯,黑茶b杯。小明喝同一种茶最多连续喝k杯。问是否存在一种方案使得小明喝完这n杯茶,是则输出任意一种顺序。

分析:贪心

  我们的目标是尽可能制造绿茶和黑茶相等的局面,所以先尽可能将多的那个喝成与少的那个相等,若相等则直接可以了,若不相等则喝一杯少的,再继续尽可能喝那多的,如果中间无法操作则-1

E

题意:现在给了n个数字,然后还有一个1到m,代表可以把a里面任意一个数换成1-m,最后需要保证a数组里面的所有的数的奇数个数等于偶数个数,问最少的换的次数,以及换了之后的数组是什么样子的,当然还有不能达到的情况,输出“-1”。

分析:思维题

  把奇数和偶数分开处理

  开两个set,将奇数数组里的不相同的数放进一个set,将偶数数组里的不相同的数放进另一个set

  奇数指针p=1,偶数指针q=2

  依次遍历奇数数组和偶数数组中重复出现的数(它们需要被改掉) 每次放数,p+=2,q+=2,当然如果p,q在各自的set中出现过,则还要再增加,一直到没有出现过为止

  当然这样只是能保证奇数数组中的数都不同,偶数数组中的数都不同,而奇数和偶数的总数还不一定相等

  为了解决这种情况,不放假设奇数数量>偶数数量

  那么需要先开始用p的自增来替代偶数数组中重复出现的数,直到奇偶数量平衡

  在上述所有的p,q自增操作中,一旦超过了m,则说明不可行,输出-1

  在操作过程中,记录下每个位置最终的答案得到ans[],与原始的x[]比较得出最少更改多少个

F

题意:一个人又k的时间听n首音乐,每一首音乐都有一个愉快度,然后这个人可以选择听这首音乐完整时间t,1/2向上取整的时间,还要满足听了一半的个数<=m

分析:模拟+set

  考虑一段x首歌,最优的方法肯定是让其中时间最长的m首歌曲时间减半

  考虑一个可行解i~j,那么对于下一个可行解i+1~x,那么x>=j,即两个指针是非单减的,所以只要弄个数据结构维护这一类似单调队列的东西

  具体的做法是弄两个set表示一段区间中未减半时间的和减半时间的

  每次判断j指针能否后移,先看减半时间的set是否满了,若未满直接判断加入减半时间是否合法;若满了则判断减半时间的set中的最小值和t[j]大小,如果t[j]大就将最小的那个放进未减半时间set中,t[j]放入减半时间那个,判断是否合法

  对于每个i指针,求出最远的j指针,并不断更新答案

  然后需要对i指针进行删除

  若i在未减半set中,直接删除,若在减半set中,把i删除后还需要把另一个set中最大的那个加入减半set中

  注意set.end()是开区间,所以取一个set最大的时候需要先得到它的迭代器,然后自减

G

题意:给出一颗树每个深度节点的个数,并给出叶子节点的个数,问能否形成一个树,若能输出任意一种

分析:构造

  考虑最少要多少叶子节点

  最底层的,以及第i层节点数量比第i+1层节点数量多的这种都肯定是叶子节点,统计最少叶子节点的总数,和给出的比较,如果不够,则输出-1,否则将那种节点全部标记为叶子节点

  对于那些多的叶子节点,可以自底向上尽可能标记

  最后根据标记输出可行方案即可

  先看哪些是必须为叶子节点的

Codeforces Round #386(div 2)

标签:等于   round   处理   思维   end   更改   分析   表示   节点   

原文地址:http://www.cnblogs.com/wmrv587/p/6263086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!