Codeforces #536部分题解

第一次见识中国场,成功的睡过了,然后补测了一下,,,切完前四题基本就挂机了。。。。

A. 看联通块,暴力就好了。。。

B. 一个模拟,题意很复杂,有 N 个菜,每道菜有 a 盘,价格为 c,

接下来有 m 个客人,每个客人可能会要求买第 t 号菜 d 盘,如果 不够的话就买目前价格最低的知道买够d盘,如果买不够d盘,客人就会发怒,然后一分钱都不给直接走人。

问题难点在于从小到大排序后还需要记录原来的编号,如果每次都在遍历的话 m 1e5 ,n 1e5,可能会炸掉,所以这里我直接搞了个标记数组,记录下按价格排序后的编号,重新排序后原来第 i 号菜新编号为 j 那么 就用 id[ i ] = j 就好了

之后记录下目前剩余菜的总盘数,记录目前最低价格菜的位置,如果 sum = 0直接输出0,然后不断地进行模拟就好了

C. 卡了一会,发现 C 比 B简单。。。。

n 个数字(n必定为 偶数) 让你对这些数字分组,每组最少 2 个,设 k 组每组中 a[ i ] = (k1 + k2 +k3 +.....) ^2 求n个数字中a[i]之和最小结果。。。听上去很抽象,但是你读一下题就会发现,如果我一个组内数字太多了,那么这个^2 就会变得更大,举个例子(虽然自己在写的时候没想这么多) 1 1 1 1  4 4 我们如果 4个1合体 那么很显然 2个4合起来会炸,所以尽可能要把大数和一个小数分在一起,保证数字小一些,因为最少要有两个数字,那么肯定2个数字最好, 不信你发现 (1+1+1+1)^2 > (1+1)^2 + (1+1)^2

所以直接排序然后贪心一波就好了。。。。

D. 给一个n 个点 m 条路的连通图,保证连通,可能有重复边,可以往回走,求走节点字典序最小的方法

我们看一下例题就会发现,对于 a 的相连点,我们每次都会挑选字典序最小的先走,因为可以往回走,不需要 dfs ,直接队列就可以搞定,但是可能的卡点在于 我在一个地方走的很深,但是发现下一个节点比最开始节点连接的点要大,这就很尴尬了,所以遇到这种情况,我们就是返回去,走一下那个最小的,再走回来,那么我们发现一个优先队列最小堆就可以解决了,遇到连通点加入最小堆,每次bfs 最小堆 的 top 就好了。。。。

E 貌似是个 dp... 挂机了1小时之后,放弃了。。。。

还是太弱了。。。。

你可能感兴趣的:(寒假计划)