2021牛客多校#8 C-Fuzzy Graph(构造)

题目链接

点击传送入队友家

题目大意

有一个   n ( 3 ≤ n ≤ 3   ⋅ 1 0 5 ) \ n(3\leq n\leq 3\ ·10^5)  n(3n3 105)个点   m ( 3 ≤ 5   ⋅ 1 0 5 ) \ m(3\leq 5\ ·10^5)  m(35 105)条边的简单无向图,需要将每个顶点染为红绿蓝三种颜色之一。然后对于每条边,若其两个端点颜色一样,则边也变成对应颜色,否则保持黑色。
基础目标为:

  • 仅有黑边的情况下,图依旧保持联通。

在完成基础目标的前提下,还可以完成以下额外目标:
1.每种颜色顶点数相同。(保证 n n n 3 3 3 的倍数)
2.某种颜色的顶点数最多,但该颜色的节点的相邻边都是黑色。这个额外目标可以达成多次。
如下所示,左图是染色前,右图是按某种方式染色后的结果,其满足基础目标,每种颜色的顶点数相同,绿色节点出现次数最多且相邻边均为黑色,因此满足两个额外条件。
在这里插入图片描述
给定未染色的图,求至少满足一个额外目标的方案,或判断无解。

题解

我们先考虑基础目标,由题意得在相邻两个节点颜色不同的情况下是满足的。
我们先用两种不同的颜色填充整个图形,在奇数层用绿色,在偶数层用蓝色。
考虑第一种额外情况:当绿色和蓝色数量大于 n 3 \frac{n}{3} 3n我们可以在整张图上修改任意个节点标为红色,使三种颜色到达平衡。这时我们只要考虑红色的节点相互之间不矛盾即可,简单的贪心。
修改过程中从底部出发,可以尽可能减少冲突。
当绿色和蓝色数量有一个小于 n 3 \frac{n}{3} 3

### 联合活动 Chocolate 问题解题思路 #### 背景描述 在网的联合活动中,“Chocolate”问题是关于如何合理分配巧克力给朋友。具体来说,目标是通过K次切割将一块由个连续部分组成的巧克力分成K+1份,每一份都包含一些连续的部分。 #### 解决方案概述 为了有效地解决这个问题,可以采用动态规划的方法来寻找最优解法。该方法的核心在于定义状态转移方程以及初始化边界条件[^1]。 #### 动态规划实现细节 - **状态表示**:设`dp[i][j]`代表前i个块中做最j刀所能获得的最大价值。 - **初始条件**:当没有切分时(`j=0`),最大值即为整个区间的总和;对于其他情况,则需遍历所有可能的位置进行尝试。 - **状态转移**:对于每一个新的位置k,在其之前已经完成了一定数量的分割操作(j),此时需要计算从当前位置到起点之间的最小成本,并更新全局最优解。 ```python def max_chocolate_value(chunks, K): n = len(chunks) # 计算区间内的累积和用于快速求子数组之和 prefix_sum = [0] * (n + 1) for i in range(1, n + 1): prefix_sum[i] = prefix_sum[i - 1] + chunks[i - 1] dp = [[float(&#39;-inf&#39;)] * (K + 1) for _ in range(n)] # 初始化第一列 for i in range(n): dp[i][0] = prefix_sum[i + 1] for j in range(K + 1): # 遍历每一刀数目的可能性 for i in range(n): # 当前考虑到第几个chunk为止 if j == 0 or i < j: continue for p in range(i): # 尝试不同的最后一刀位置p cost = abs(prefix_sum[p + 1] - prefix_sum[i + 1]) dp[i][j] = max(dp[i][j], min(dp[p][j - 1], cost)) return dp[-1][-1] ``` 此算法的时间复杂度主要取决于三重循环结构O(N^3*K),其中N为chunks的数量,K为允许的最大切割次数。虽然看起来效率不高但对于题目规模而言是可以接受的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值