首页 > 其他分享 >【CSP】202012-4 食材运输 70% 一点思路

【CSP】202012-4 食材运输 70% 一点思路

时间:2024-04-12 20:44:59浏览次数:11  
标签:遍历 const int up 食材 该点 202012 70% include

对于K==M的情况,问题重点是:如何统计从某点出发,遍历需要某食材的所有酒店最小权重和。

考虑到N规模很小,因此可以直接枚举从每个点出发的权重和,问题就转化为如何求从某点出发,遍历某食材的权重和。由于图为一棵树,所有该权重和是唯一的。

有两个限制条件:如何知道某食材的全部酒店已经经过、每个点如何到达下一个点(即遍历的顺序/路径)。

再仔细思考问题,若从某点出发遍历树中的任意子集S并最后回到该点,将该点看作根节点,则其到每个节点所经过的路径(记作E)都要走两遍。

如果不回到该点,那么就可以选一个距离根节点最远的点减去,因为这条路径不需要走两遍。

发现这个关键结论后,就可以知道两个限制条件如何解决:直接将该点作为根节点遍历整棵树,用dp存储在E上的路径总和,转移方程为

dp[u] = \sigma_{i属于sons} (sons子树存在需求酒店或son本身为需求酒店)*dp[i] + w

这样就可以不用在意遍历的顺序。启示是,不能总用线性搜索的方式看待问题,深入考虑到树状问题的子结构性质,可以解决许多看起来毫不相关的问题。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <string.h>

#define up(l,r,i) for(int i=l;i<=r;i++)
#define dn(l,r,i) for(int i=r;i>=l;i--)

typedef long long ll;

#define int ll

using namespace std;

inline int _max(const int& a,const int& b){return a>b?a:b;}
inline int _min(const int& a,const int& b){return a<b?a:b;}

const int MAXN = 104,MAXM = 15;

struct Node{
    int to,w,nxt;
    Node():to(0),w(0),nxt(0){}
}nd[MAXN<<1];

int head[MAXN],ecnt;
int fa[MAXN],dp[MAXN];

void add(int a,int b,int w){
    nd[++ecnt].to = b;
    nd[ecnt].w = w;
    nd[ecnt].nxt = head[a];
    head[a] = ecnt;
}

int ned[MAXN][MAXM];
int n,m,k;

int dfs(int u,int tp){
    int mx = 0;
    for(int i = head[u]; i; i = nd[i].nxt){
        int v = nd[i].to;
        int w = nd[i].w;
        if(fa[u] == v) continue;
        fa[v] = u;
        
        int t = dfs(v,tp);
        if(ned[v][tp] || dp[v]){
            dp[u] += dp[v] + (w<<1);
            mx = _max(mx,t+w);
        }
    }
    return mx;
}

signed main()
{
    //freopen("y.in","r",stdin);

    ios::sync_with_stdio(false);

    cin>>n>>m>>k;
    up(1,n,i){
        up(1,k,j){
            cin>>ned[i][j];
        }
    } 
    up(1,n-1,i){
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c);
        add(b,a,c);
    }

    //if(n == 6 && m == 1 && k == 2) {cout<<15<<endl;return 0;}
    
    int mx = 0;
    up(1,k,i){
        int mi = 0x777777f;
        up(1,n,j){
            memset(dp,0,sizeof(dp));
            memset(fa,0,sizeof(fa));
            int t = dfs(j,i);
            int ans = dp[j] - t;
            mi = _min(mi,ans);
        }
        //printf("对于类型%lld,计算结果为%lld\n",i,mi);
        mx = _max(mx,mi);
    }

    cout<<mx;

    return 0;
}
70%

 

标签:遍历,const,int,up,食材,该点,202012,70%,include
From: https://www.cnblogs.com/dudujerry/p/18132053

相关文章

  • 2-70. 核心功能评估周围节点得到最短路径
    修改AStar项目相关代码代码仓库:https://gitee.com/nbda1121440/farm-tutorial.git标签:20240412_1338......
  • 报关软件-单一窗口打开报错50070
    事件起因:某报关行客户电话报修,USB版本的单一窗口无法登陆,下图为客户提供的报错截图 在重新安装了单一窗口的客户端控件之后,报错内容更改,但问题并未解决  解决办法:1、删除浏览器的所有记录(包括下载记录、浏览记录、cookie等等,需要完全清......
  • MCD4700信息技术
    MCD4700信息文凭技术1.MCD4700计算机系统导论,网络与安全——12024作业2——过程和MARIE编程指令目的过程和程序使计算机做我们所做的事情希望他们做。在本作业的第一部分,学生将调查他们计算机上运行的进程。第二个部分是关于MARIE汇编语言的编程。这将让学生展示他们对处理器工作......
  • java代码将16进制字符串转换为图片,jdbc入库blob字段,解决ORA-01704,PLS-00172,ORA-06550,
    从Oracle导出SQL文件中的insert语句包含blob字段,语句HEXTORAW函数将16进制的字符串入库,由于字符串太长,insert失败下面的代码读取完整的insert语句,将HEXTORAW函数连同16进制的字符串替换为NULL,先将字段置空插入记录,然后使用PreparedStatement对图片文件读流更新入库importorg.......
  • CF1670B Dorms War 题解
    题面。不好意思,把这道题的通过率拉低了,但坑点确实有。思路多出几个数据,我们可以发现,在不报警的前提下,最多可以操作数量是两个特殊字符间的最长距离。解释对于不报警的定义是:每次删除操作进行前,当前的字符串中的所有特殊字符的前一个位置必须不是特殊字符。换句话说,只要当前......
  • Message No. M7036
    调试MIGO进程我们注意到系统将读取确认并获得sy-subrc=1DebuggingMIGOprocesswenoticethatthesystemisgoingtoreadtheconfirmationandobtainessy-subrc=1由于确认控制,GR似乎未进行。ItseemsthattheGRisnotcarriedoutduetotheConfir......
  • GD32F470II的UART+DMA方式的使用笔记
    GD32官方给的DEMO真的是屎一样的存在,仅展示最基本简单的应用案例,拿到实际工程中参考性非常低,也就基本的配置过程具有有限的参考性。在这种环境下,使用UART+DMA的方式完全是瞎用,感觉能用的函数都给用上。UART&DMA配置如下:1/*!2\briefconfigureUSARTDMA3......
  • 21天【代码随想录算法训练营34期】第六章 二叉树part08 (● 235. 二叉搜索树的最近公共
    235.二叉搜索树的最近公共祖先因为是搜索二叉树,所以只要值在q和p之间,那么就是lowestcommonancestor#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,x):#self.val=x#self.left=None#self.right=None......
  • GD32F470_GP2Y0A02YK0F 红外激光测距传感器 避障测距20-150cm模块移植
    2.4红外测距传感器GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(positionsensitivedetector)和IRED(infraredemittingdiode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输......
  • GD32F470_VL53L0X激光测距传感器模块移植
    2.15VL53L0X激光测距传感器VL53L0X是ST公司推出的新一代ToF激光测距传感器,采用了第二代FlightSenseTM技术,利用飞行时间(ToF)原理,通过光子的飞行来回时间与光速的计算,实现测距应用。较比上一代VL6180X,新的器件将飞行时间测距长度扩展至2米,测量速度更快,能效更高。除此......