A. Buy a Shovel
有单价为k的商品和1个r面额的硬币,输出最小的不需要找零的最小购买件数。for就行了。
#include
B. Cormen — The Best Friend Of a Man
增大一个序列中的某些项,使得增加后的序列的相连两项和为k。输出增加的值的和。
贪心着搞就行了,第一天不变,之后的每一项都根据前一项来确定增加多少,然后输出和。
#include
C. Sanatorium
给定b,d,s分别为一个人吃早餐,中餐(可以这么理解)和晚餐的次数,输出这个人最少有几顿饭没吃。note:这个人可能在一天中的任意时间到达,比如晚饭之前,这样他就吃上晚饭,所以0 0 1这组数据的答案是0。
首先假设在早饭之前到达,取b,d,s中最大的,作为最后一天,然后就可以计算一个答案。
然后s--,也就是假设晚饭之前到达,可以计算出一个答案。
最后d--,假设中饭之前到达,计算出一个答案。
然后3个答案取最小值。
#include
D. Exams
有n(n <= 2e5)天和m个科目,要在n天内把m个科目全部考完,每天可以 复习某一科或者进行某一科的考试。
输入d[i],代表第i天只能考科目d[i],d[i]==0代表当天不能考试。
再输入m门科目的复习时间,在科目i考试之前必须花费a[i]复习科目i。
最后输出考完所有科目最短时间,考不完则输出-1。
首先记录一下m门科目的考试时间,然后二分答案,每次检查能否在mid天之前(含mid)完成。
通过二分考试时间数组来找到m门科目在mid之前的最晚考试时间。
定义一个变量来记录可用的复习时间。把科目按照时间从小到大排序开始枚举,每次检查re是否大于等于a[第i个科目的id] + 1,小于0即false,否则re加上从当前科目的考试时间到下一个科目的考试时间。能遍历到m同时re>=0即为true。
#include
E. Sockets
n台电脑,m个插头,每个插头可以连接一台电脑,当电脑电压等于插头电压时,电脑可以工作。给出电脑工作电压,插头的电压,现在可以把插头电压变为(原电压+1)/2,。求最多能工作的电脑数c以及使c台电脑工作的最小变换次数。
把电脑安装power排序。定义一个pos指针,指向当前电脑。把每个插头的id、power以及每个插头的变换次数放到优先队列中。
每次取power最大,变换次数最小的插头检查与电脑pos的电压比较,大于pos电压就加一除二重新入队,等于就pop并且pos--,小于重新入队且pos--。
中途记录一下匹配的id。然后就可以输出答案了。
#include
F. Tourist Reform
给出一个n个点,m条边的连通无重边的无向图。现在把无向变有向,使得r[i](r[i]表示从i出发能够达到的点的个数,包含到达自身)的最小值最大。
首先可以知道的是,限制变换后的有向图的the minimum of r[i]的大小的一定是原无向图中的桥。因为去掉原图中的桥的时候,原图会被分为两个不连通的子图,所以在变换后,必定会有一个子图无法到达另一个子图。所以瓶颈是原图中的桥。进而就可以得出:变换后的有向图中的桥都必须背向顶点数最多的双连通分量。这样操作就会使只有一个双连通分量被孤立,同时被孤立的点的数目是最多的。
然后考虑把原图中的桥断开后,原图就变成了若干个双连通分量,下一步就是把它们变为强连通分量,使得连通分量内部两两可达。
所以具体过程就是:
(1)求原图中的桥
(2)去掉图中的桥,把双连通分量变为强连通分量。每次从双连通分量中的任意一点出发开始dfs,每走一条边就记录答案,通过vis来判断是否已经走过该点,同时不能走桥。每进行完一次dfs,就更新一下顶点数最多的双连通分量,start为该连通分量中的任意一点。
(3)从start出发开始dfs,遇到桥就记录一下答案,注意要反向记录。
#include