赛场上被C题打自闭了。
A Pen and Pencil
讨论两组数相除向上取整是否小于铅笔盒的容量。
B Rooms and Staircases
题目描述
有两层楼梯,一层有$N$个房间,房间是互通的。输入一串01串,1表示当前房间可以通向楼上或者楼下。问一次不走回头路的走法最多可以到达几个房间。
Solution
手玩样例即可发现,如果在最左边和最右边的房间有楼梯,显然是可以走完$2N$也就是所有的房间。这个楼梯每往中间缩一格,就会少到达2个房间。讨论楼梯对于答案的最大价值$T$。$T$就应该是离最左边或者最右边较小的那个值。用$(N-T+1)2$便得到结果。
C Football Season
题目描述
给定四个数$n,p,d,w$$(d\ge w)$
求三个合理解$(x,y,z)$,其中$x,y,z\ge0$
使得
$xw+yd=p$
$x+y+z=n$
Solution
一开始拿扩欧做的。后来发现不好处理正整数解这一点。
后来采取暴力方法。
考虑到$d\ge w$所以把$p$分为几个$lcm(d,w)$大小的块,全部分配给$x$,最后余留的部分和1个$lcm$去暴力枚举$x$的取值,判断对应$y$是否有正整数解。
1 | #include <bits/stdc++.h> |
D Paint the Tree
题目描述
给定一棵节点数为$N$的无向树,对于每一个节点,有三种染色,每种染色所需要的代价为$V_{i,j},i\in{1,2,3},j\in[1,N]$。对于一颗树,一个合法的染色方法必须使得对于任意三元组$(x,y,z)$,其中$x$与$y$相连,$y$与$z$相连,保证$x,y,z$三者的颜色互不相同。问是否有合法染色方案,如果有,给出最小代价。
Solution
对性质进行分析,发现如果存在一个点有三个及以上的出度,显然不成立。所以,一个点最多只有两条出边。又因为原图为一棵树,所以一定是一条链。找到链首,以及第二个元素,枚举他们两者的颜色方案,此时整条链的染色方案也就定了下来,判断最小代价并在路径上存储答案即可。
1 | #include <bits/stdc++.h> |
E Minimizing Difference
题目描述
给定$N$个数的序列与$K$次操作,其中,一次操作可以将某一个数$+1$或者$-1$。问在最多$K$次操作后,这$N$个数中的最大值与最小值的最小差是多少。
Solution
首先,很显然的贪心性质:要让最小的变大,最大的变小才会对答案有贡献。
那么考虑是让小的变大还是让大的变小。
先按大小排序,然后用两个指针从两头向中间扫,如果遇到和当前值相同的,就将每次需要付出的代价++,每跳到下一个数,便比较是最小的少,还是最大的少。选择少的去进行操作。
如果离下一个数太远不能到达,就尽可能往前走。
代码细节比较多,注意实现。
1 | #include <bits/stdc++.h> |