2018-11-1 NOIP 模拟赛解题报告

时间:2024-04-13 00:03:24

T1 Domino 多米诺骨牌

题目大意

给你N个骨牌,上下各有一个数,要使上面一排的和为偶数,同时下面一排的和也为偶数,最多要翻转多少次?如果无法达成那么输出-1。

解法

水题秒切

根据数的奇偶性质,无论如何,我们最多只需要翻转一个骨牌即可达成目的。所以只有三种可能:翻转一次达成目的,无法达成目的,不用翻转就达成目的。

骨牌有以下几种情况:

1上下两排和一奇一偶

  1.我们如果翻转一个上下奇偶性不同的骨牌,上下两排奇偶性分别翻转,还是一奇一偶,无法达成

  2.我们如果翻转一个上下奇偶性相同的骨牌,那么上下两排奇偶性根本没变过,无法达成

  所以这种情况直接输-1

2上下两排和都是偶数

  这种情况默认就达成条件,不用翻转,输出0

3上下两排和都是奇数

  1.我们如果翻转一个上下奇偶性不同的骨牌,上下两排奇偶性分别翻转,就变成两偶了,符合条件

  2.我们如果翻转一个上下奇偶性相同的骨牌,上下两排奇偶性不翻转,还是两奇,无法达成

  所以对于这种情况,我们只需要枚举其中一个骨牌是否上下奇偶性相反就行了。

T2 lift 电梯问题

题面

某大厦共有 N 层,现在知道共有 K 个请求要上下电梯;下面告诉你每个请求乘电梯的出发层次和结束层次。请你求出整个电梯的运行过程。

假设电梯一开始停在第一层,运行 K 个请求最后回到第一层。 例如有个 9 个层次的电梯,共接收到 5 个请求。

1 5(表示要求从 1 层到 5 层)
4 2
2 8
6 9
5 1

那么电梯的运行路线为:1-2-5-6-8-9-5-4-2-1

解法

也是水题qwq.

因为这么多请求都是同时发生的,所以电梯肯定是从1层到请求中的最顶层,然后再下来。

因为电梯为了时间最优,肯定不会跑回头路,比如有一组数据是这样的:  ,;,;,  。运行路径肯定不是1-2-1-3-4-2-1,而是1-4-3-2-1。

所以我们可以根据乘客上下分成两组,分别桶排,然后上行的从小到大输出,下行的从大到小输出。

注意:

如果有一个乘客从某一层到顶层,另一个乘客从顶层到某一层,注意判重。

T3 月亮之眼

题目链接

用SPFA进行差分,关于SPFA,虽然“死了”但是做差分应该不会卡你...

从第a个珍珠到第b珍珠有一条单向边c,就建一条从a到b的正权边c,再建一条反过来的负权边-c。

(如果自上而下有一条边,那么从上到下的距离就是c,从下到上的距离就是-c,这样如果有矛盾的情况,就是负环了,同时这种方法也可以求最短路。)

取结果数组中距离最大的结点,就是最顶端的结点,设其长度为$maxx$,则每条边长度是$dist[i]-maxx$。

关于判断负环:如果一个结点进队N次以上,那么直接输-1并退出。

T4 口袋的天空

题目链接

也是比较水的一道题。

因为题面中给你边,还让你选择边,那和最小生成树最接近了。

Prim 算法是基于点的操作,所以暂时不考虑。

只剩下 Kruskal 了,还是基于边的操作,那应该就是了。

N个结点,N-1条边,那肯定是一棵树,也就是一个联通块。

那我们需要很多联通块,所以肯定要少连几条边,少连的这几条边肯定要越大越好。

我们如果连n-1条边,就有0个结点被孤立,总共1个联通块。

我们如果连n-2条边,就有1个结点被孤立,总共2个联通块。

……

我们如果连n-i条边,就有i-1个结点被孤立,总共i个联通块。

所以Kruskal连最短的n-k条边就可以了。