首页 > 其他分享 >经商 来源:牛客网

经商 来源:牛客网

时间:2023-01-03 15:07:00浏览次数:34  
标签:fa int 经商 xg yg find 牛客 来源 dp


题目

链接:https://ac.nowcoder.com/acm/contest/28886/1022

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

题目描述

小d是一个搞房地产的土豪。每个人经商都有每个人经商的手段,当然人际关系是需要放在首位的。

小d每一个月都需要列出来一个人际关系表,表示他们搞房地产的人的一个人际关系网,但是他的精力有限,对应他只能和能够接触到的人交际。比如1认识2,2认识3,那么1就可以接触3进行交际,当然1和2也可以交际。

小d还很精明,他知道他和谁交际的深获得的利益大,接下来他根据自己的想法又列出来一个利益表,表示他和这些人交际需要耗用多少精力,能够获得的利益值为多少。

小d想知道,他在精力范围内,能够获得的利益值到底是多少。

设定小d自己的编号为1.并且对应一个人的交际次数限定为1.

输入描述:

本题包含多组输入,第一行输入一个数t,表示测试数据的组数 每组数据的第一行输入三个数,N,M,C,表示这个人际关系网一共有多少个人,关系网的关系数,以及小d的精力值 接下来N-1行,每行两个数ai,bi。这里第i行表示和编号为i+1的人交际需要花费ai的精力,能够获得的利益值为bi。 再接下来M行,每行两个数x,y,表示编号为x的人能够和编号为y的人接触 t<=50 2<=N<=10000 1<=M<=10*N 1<=ai,bi<=10 1<=C<=500 1<=x,y<=N

输出描述:

输出包含一行,表示小d能够获得的最大利益值

示例1

输入

1 5 3 7 5 10 3 2 4 3 1 100 1 2 2 3 1 4

输出

10

题解

在这道题目里:关键是找到小d所能接触到的人

我想:对于所有人,也就是遍历,没有什么好的办法

现在就需要找到小d可以接触到的人,进行遍历快快使用并查集,遍历仅仅是常数

就这么办!

意想不到竟然还有动态规划!!!

好,我认,我不会!!!


现在可以了01动态规划+并查集OKK

事实上:dp的时候,并不需要怎么多数组,一维数组就可以了,可以采取滚动数组的方式

但是一定要注意:要从左到右搞,不然会出事!!!


代码

#define _CRT_SECURE_NO_WARNINGS


#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;//这里可以使用结构体进行存储,也可以单纯的使用数组,为了方便,我用数组
#define MAX 10007
int r[MAX];//按秩合并
int a[MAX];//a
int b[MAX];//b
int fa[MAX];//爸爸是谁
int dp[MAX];//动态规划(貌似时间复杂度有一丢丢大)
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
inline void mer(int x, int y)
{
int xg = find(x);
int yg = find(y);
if (xg == yg)
return;
if (r[xg] > r[yg])
{
fa[yg] = xg;
}
else if (r[xg] < r[yg])
{
fa[xg] = yg;
}
else if (r[xg] == r[yg])
{
fa[xg] = yg;
r[yg]++;
}
return;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
memset(dp, 0, sizeof(dp));//注意动态规划需要进行初始化
int n, m, c;
scanf("%d%d%d", &n, &m, &c);
for (int i = 1; i <= n; i++)//初始化并查集
{
r[i] = 0;
fa[i] = i;
}
for (int i = 2; i <= n; i++)
{
int t1, t2;
scanf("%d%d", &t1, &t2);
a[i] = t1;
b[i] = t2;
}
for (int i = 1; i <= m; i++)
{
int t1, t2;
scanf("%d%d", &t1, &t2);
mer(t1, t2);
}
for (int i = 2; i <= n; i++)
{
if (find(i) == find(1))
{
for (int j = c; j >= a[i]; j--)
{
dp[j] = max(dp[j], b[i] + dp[j - a[i]]);
}
}
}
printf("%d\n", dp[c]);
}
return 0;
}


标签:fa,int,经商,xg,yg,find,牛客,来源,dp
From: https://blog.51cto.com/u_15926877/5985755

相关文章

  • 牛客寒假算法基础集训营4-J-Applese 的减肥计划
    链接:​​https://ac.nowcoder.com/acm/contest/330/J​​牛客网 已知Applese两只手分别产生的力的大小,以及它们之间的夹角,试求两力合力的大小。输入描述:仅一行三个整......
  • 牛客寒假算法基础集训营4-B-Applese 走方格
    链接:​​https://ac.nowcoder.com/acm/contest/330/B​​​牛客网 在这个游戏中,它位于一个n行m列的方阵中的左上角(坐标为(0,0),行的序号为0∼n−10∼n−1,列的序号为0......
  • 牛客训练(BIT+高精度)
    又是这类用BIT辅助计数的题。。这个显然满足要求的区间比不满足的要多太多,所以变成求不满足的。。。然后要先求总方案数,为这个不是很想在化了,反正O(n)求也可以的。。然后求......
  • 牛客2022跨年场
    牛客2022跨年场​F题使用python,就是加了一个end='\0',然后寄了好多。A猜群名小沙为了这场元旦比赛绞尽脑汁,他现在在每个题目中藏入了一个字,收集所有的字,并将按照题号......
  • 牛客练习赛107
    挺有难度的比赛。A求\((n!)!\modm,n,m\le1e6\)容易发现n!>m之后答案为0。B仔细看题。考虑两个序列中的1能不能都放在一号位可以的话就是最优的。不能的话考虑一个......
  • 牛客小白月赛64 C题 题解
    题目链接题意描述这一题的意思其实就是,让你构造一个\(n*k\)的矩阵,使得第i列的总和为i,同时使得:每一列的任意两个数之间的差不大于1,且任意两行之间的总和差不大于1。......
  • 牛客--64--F
    关键这个题目很值得学习呀!看着是不能记录所有的状态,但是可以映射一下,然后就是直接线性dp了代码#include<bits/stdc++.h>usingnamespacestd;constintM=2e6+5;co......
  • 大数据开发面试题,牛客上面试被问频率最高的几道面试题
    大数据开发面试题,牛客上面试被问频率最高的几道面试题一、Hadoop部分一、HDFS文件写入和读取过程****可灵活回答:1)HDFS读写原理(流程)2)HDFS上传下载流程3)讲讲(介绍下)HDFS4)HD......
  • 牛客网刷题笔记篇
    字符串篇字符串翻转链接地址importjava.util.*;publicclassSolution{publicStringtrans(Strings,intn){//writecodehereif(n=......
  • 牛客 --- 音量调节(递推dp)
    原题链接:https://ac.nowcoder.com/acm/problem/19990思路:1)很像电梯问题,升或降对应调高或调低,所以内部每次要考虑两个状态。说到内部,如何结合01背包找最大音量呢?2)我们知......