首页 > 其他分享 >贡献法和染色的妙用

贡献法和染色的妙用

时间:2024-04-16 11:58:57浏览次数:17  
标签:妙用 连通 格子 示例 染色 可以 铺满 贡献

链接:https://ac.nowcoder.com/acm/contest/80259/E
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小红拿到了一个 n ∗ n 的方格矩阵。她准备划分成若干个大小为 3 的 'L' 型连通块和若干个大小为 4 的 2 * 2 连通块。已知每个 'L' 型连通块可以获得 x 分,每个 2 * 2 的连通块可以获得 y 分。小红想知道自己最多可以得到多少分?

输入描述:

三个正整数 n, x, y 用空格隔开。
1 ≤ n, x, y ≤ 1e6
保证 n 是偶数。

输出描述:

小红最大的得分。

示例1

输入

2 4 3

输出

4

说明

可以划分一个 'L' 型连通块。

示例2

输入

4 4 5

输出

21

说明

如下图,可以划分出 4 个 'L' 型连通块和一个 2 * 2 的连通块,这样的得分是最高的。










解答

  • 四个格子价值 y,三个格子的 L 型价值 x,如果 y/4 >= x/3,铁定用 y 了,而且还能铺满,否则,考虑 r = n mod 3 的分类讨论:
  • 为啥考虑 mod 3,因为两个 L 构成一个方形,能铺满,所以先把前面铺满的地方用 L 铺满,前面价值一定比四个格子的大
  • 考虑后面无法用 L 铺满情况:
  • r 为 0,显然可以铺满;
  • r 为 2,那么可以尽量铺满,先横着放(2x3 的两个 L )直到剩下两列,在这两列再竖着放,直到剩下一个 2x2 的,看这个 2x2 的铺 L 还是四个格子价值大
  • r 为 1,比较复杂,可以先横着 L,剩下 4 列,再双列竖着 L,直到剩下 4x4 的空位,看 5 个 L 和 4 个方块 + 1 个 L 谁大
  • 这里为啥不是由每个格子贡献决定,因为前面都是铺满状态,我们通过比较每个格子贡献,那么贡献大的一定最优,但是这里最后无法铺满情况,虽然可能单个格子 L 大,但是方块量大,可能会弥补这个差距,成为最优
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;

int main() 
{
    LL n, x, y;
    cin >> n >> x >> y;

    if (x * 4 > y * 3)
    {
        if (n % 3 == 0)
            cout << (n * n / 3) * x << endl;
        else if (n % 3 == 1) 
            cout << ((n * n - 16) / 3) * x + max(x * 5, x * 4 + y) << endl;
        else 
            cout << ((n * n - 4) / 3) * x + max(x, y) << endl;
    }
    else 
        cout << (n * n / 4) * y << endl;
    
    return 0;
}

标签:妙用,连通,格子,示例,染色,可以,铺满,贡献
From: https://www.cnblogs.com/xingzhuz/p/18137778

相关文章

  • 边遍历边统计妙用
    链接:https://ac.nowcoder.com/acm/contest/80259/B来源:牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++262144K,其他语言524288K64bitIOFormat:%lld题目描述小红来到了地下城的一个房间,房间被分成n行m列的格子,小红站在其中一个格子上,她可以向一个方向攻击整条直线......
  • 深入浅出 妙用Javascript中apply、call、bind
    这篇文章实在是很难下笔,因为网上相关文章不胜枚举。巧合的是前些天看到阮老师的一篇文章的一句话:“对我来说,博客首先是一种知识管理工具,其次才是传播工具。我的技术文章,主要用来整理我还不懂的知识。我只写那些我还没有完全掌握的东西,那些我精通的东西,往往没有动力写。炫耀从来......
  • Java高阶私房菜:探索泛型之妙用
        “泛型”(generics)作为Java特性之一,已经出现较长时间了,相信大家或多或少有接触过,接下来我们将系统重新回顾一下泛型,温故而知新,希望能有些新的启发。Java中的泛型作为V1.5后新增的特性,在JDK源码、中间件源码中有大量的使用,如果掌握了泛型将更容易理解源码,也提升代码抽......
  • 大型场景中通过监督视图贡献加权进行多视图人物检测 Multi-View People Detection in
    Multi-ViewPeopleDetectioninLargeScenesviaSupervisedView-WiseContributionWeighting大型场景中通过监督视图贡献加权进行多视图人物检测论文urlhttps://ojs.aaai.org/index.php/AAAI/article/view/28553论文简述:这篇论文提出了一个用于大型场景中多视角人体检测......
  • Python中global和nonlocal关键字的妙用:变量管理技巧
        概要在Python中编写函数时,经常会遇到需要在函数内部访问和修改外部变量的情况。在这种情况下,我们可以使用 global 和 nonlocal 关键字来声明变量的作用域,以便正确地访问和修改这些变量。本文将深入探讨 global 和 nonlocal 的用法,包括详细的示例代码和......
  • 棋盘进行黑白染色(java)
    【题目】 有一个n*m的棋盘,现在对这个棋盘进行黑白染色,左上角染成黑色。从左上角开始,每个黑色格的相邻格染成白色,白色格的相邻格染成黑色。以下给出了一个5*7的棋盘的染色示例。给定n和m,请问棋盘上一共有多少方格被染成了黑色。【代码】publicclassTest13{public......
  • 小美的树上染色(美团2024届秋招笔试第一场编程真题)
    题面核心思想树形DPdp[1]表示以当前节点为根节点所包含的子树且当前节点能染色的最大染色数量dp[0]表示以当前节点为根节点所包含的子树且当前节点不染色的最大染色数量详情看注释~代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[......
  • 树形DP+树上路径贡献
    题目一棵树有n个节点,每个节点都同有一个符号+或者-,表示该节点是正极节点还是负极节点。如果从正极走到负极,或者从负极走到正极,都会受到1点伤害。现在需要知道走过所有路径后会受到的总伤害是多少?树上任意2点存在唯一的路径。需要计算所有任意2点的路径的伤害和。注意:从u到,和从v......
  • 理解 Python 编程中 *args 与 **kwargs 的妙用
    文章目录一、形式参数与实际参数二、*args与**kwargs三、总结......
  • C++中Switch穿透的妙用
    在C++中,Case穿透(fall-through)指的是在switch语句中,一个case标签没有显式地使用break语句来终止,而是直接执行下一个case标签中的代码。虽然Case穿透在编程中有时会被视为不良实践,因为它可能导致代码的可读性变差和潜在的错误,但有时也可以利用它来实现一些特定的目的。以下是一些利......