Codeforces Round #398 (Div. 2)题解

来源:互联网 发布:flash编辑软件 编辑:程序博客网 时间:2024/04/30 15:13

题目:http://codeforces.com/contest/767

吐槽:

这场的题目不太行啊,感觉B题麻烦的要死,CD都比B简单。

A Snacktower

分析:简单模拟一下即可。

B The Queue

题意:

排队在窗口买票,营业时间是[ts,tf],一个人办理业务需要的时间都是t
现在知道了n个人去到达的时间f[i]
现在小明要去买票,小明到达的时间如果跟n个人中某人一样,那么就在这些人后面排队。
问小明什么时候去等待的时间最少。

分析:

  1. 如果ts开始营业之前一个人都没到,那么小明肯定这个时候去最优。
  2. 否则如果一个人办完业务之后他后面那个人还没来,那么小明这个时候去最优。
  3. 上面2种情况小明都不需要等待,否则就需要枚举小明到的时间,小明要排队,那么肯定就是排在某个人到达时间的前1刻才会有最优结果,因为这样就会排在这个人前面。
  4. 上面三种情况都要注意小明到达的时间不能晚于tf-t,因为这就不能办完业务了。

C Garland

题意:

给一棵树,每一个点有个权值v[i],删除2条边,分成3棵树,使得三棵树的节点权值和相同。

分析:

dfs即可。

D Cartons of milk

题意:

小明有n盒牛奶, 超市里有m盒牛奶,牛奶都有保质期,小明必须在保质期之前喝完n盒牛奶,并且尽可能多的买一些牛奶。问最多买几盒?

分析:

显然是二分答案,买x盒牛奶(买牛奶的话肯定优先买保质期长的)。
然后判断原来的n个加上买的x个,看看是否可以喝完。因为n个和x个都是有序的,所以加在一起的话是O(n)。
时间复杂度nlogn。

E Change-free

题意:

有个人现在去购物,需要在n天去购物,每天需要c[i]卢布,但是找每个卢布会对收银员产生f[i]的消极影响,现在他有m个卢布,并且有无数的纸币,一个纸币可以兑换100个卢布(找零钱的话收银员会心情不好)。问最少给收银员产生消极影响的方案。

分析:

首先可以肯定的是第i天至少支付纸币c[i]/100张,还需支付c[i]%100卢布。那么如果没有足够的卢布,肯定需要支付1张纸币让收银员找零(这样就会产生(100-c[i]%100)*f[i]的消极影响,得到100-c[i]%100个卢布。如果有足够的卢布有2种选择,一种是支付卢布,另一种是支付一张纸币,让他找钱,因为这样可以把卢布留着后面用(有可能后面产生某个很大的消极影响)。
乍一看像是dp,但是要求方案,好像不行。
因为当前的抉择需要考虑以后的,所以从后面贪心就可以了~~每次如果有足够的卢布,就选择当前会有消极影响最大的那个支付。
现在唯一剩下的问题就是怎么判断有没有足够的卢布,这个可以预处理一下,先假设到i前面所有的都支付纸币就是最多可以收集的卢布。

0 0