A. The New Year: Meeting Friends
同一直线上的三个人要集合,求三个人一共走的距离的最小值。
max(a, b, c) - min(a, b, c)
#include
B. Text Document Analysis
输出括号外的单词的最大长度已经括号内单词的个数。
#include
C. Polycarp at the Radio
有n首曲子明天要演奏,一个人希望他喜欢的m个乐队演奏的歌曲数的最大值最小。输出改变次数最少的演奏安排。
目的是使m个乐队至少演奏n/m首。
统计一下原来这m个乐队演奏的数目并排序。目的是使原本歌曲数多的演奏n/m+1首或n/m首(根据原本的次数判断一下改变后按演奏多少),原本少的演奏n/m首。这样一来,改变的次数就必定最小。
计算出为符合要求,乐队i需要增加或减少的歌曲数op[i]。这时op数组有正有负,来一次n^2的操作把所有的负数消掉,即找到op[i] < 0,op[j] > 0,然后op[i]++,op[j]--。
最后遍历整个序列,把大于m的乐队变为小于等于m的乐队。
#include
D. Lakes in Berland
把最少的水地变为土地,使得湖(连通块)的数目等于k。
bfs一遍统计出湖的个数、每个湖的大小以及湖的任意一点。
排序后,从每个湖中的点开始,把前tot-k个湖变为土地。
#include
E. One-Way Reform
把无向图转化为有向图,同时使得出度等于入度的点最多。并打印边。
为了使出度等于入度的点最多,要把原图转化为欧拉图,操作为:原图中奇数度的点一定有偶数个,所有将度为奇数的点两两(不是点i与所有的奇数度点连边,而是点i与任意一奇数度点相连)之间加一条边。
然后用Fleury打印欧拉回路即可,注意添加的边不要打印。
#include
F. st-Spanning Tree
在原图的基础上构建一棵生成树,同时s的度不大于ds,t的度不大于dt,并打印边。
为了使和s、t相连的边数最少,需要在去掉s和t的每个连通分量内构建一棵生成树。
然后把所有生成树连到s和t上。需要注意不是随便连,否则会出现一个连通分量既可以连到s,也可以连到t,但最后连错导致s和t度数错误。一种可行的方法是每次遇到上文描述的情况,将生成树连到距离度数限制较大的点上。
经过上一步,原图已经变成了两棵生成树,同时注意到图中没有被选中用来构建生成树的边只有3种:
1)端点为s和t;2)一端为s,另一端不为t;3)一端为t,另一端不为s。
现在只需要在一棵生成树上找到任意一条连上后符合题意的边。
#include