灰色的果实

news/2025/1/11 23:35:50/

灰色的果实

问题描述
树为灰色果实之树,不定时会长出灰色果实。贸然接近果实只会使得自己受其迷惑最后神经错乱而
浑浑噩噩不得终日,与死人无异。你的目标是成功到达树的顶端,砍下灰色果实的灵脉。
为了能够免除灰色果实的影响,你需要在灰色果实力量微弱时在树的各个点
设置若干个保护点,保护点内燃烧着镇定人心的香,以此来抵御灰色果实的精神
袭击。一个点必须在 lim[i]距离以内有保护点才能收到保护。而且,由于在树上
作业,地形十分崎岖,使得不同点设置保护点的作业时间 time[i]不同。
谋求最大的效率,请求出保护点笼罩整棵树所需的最短作业时间。
输入格式
第一行一个整数 n 表示树的初始节点数。
第二行 n 个整数 time[i] ,表示此点设置保护点的作业时间。
第三行 n 个整数 lim[i] ,表示点受到保护的限制距离。
第四行到第 n+3 行为树的初始边,有三个整数 x,y,z,代表 x 到 y 有一
条长度为 z 的枝条。
输出格式
一个数为保护点笼罩整棵树所需的最短作业时间。
样例输入(input.txt)
Sample1 Sample2
5
1 1 1 1 1
1 1 1 1 1
1 2 1
2 3 1
3 4 1
4 5 1
4
2 1 1 1
3 4 3 2
1 2 3
1 3 3
1 4 2
样例输出(output.txt)
Sample1 Sample2
2 2
数据范围
数据点 限制 其它限制
1
n≤20
边权≤150
保护所修建费用≤1000
这些都不重要
2
3
4
5
6
7
n≤100
8
9
10
11
n≤2000
12
13
14
15
16
17
18
19
20
注:[题意] 若有不懂的,可以理解为在 n 个点中设置若干个特殊点,使得特殊点保护
整棵树。
[答案] 答案保证在 int 范围之内。

30分暴力

Tips:lim[i]lim[i]

#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
int n,num,ans,HA,ha;
int dis[2005][2005];
bool flag[2005],f[2005];
int tim[2005],lim[2005];
void dfs(int x,int zhi){if (zhi>=ans) return;if (zhi>1000) return;if (x>n){for (int i=1;i<=n;++i) flag[i]=true;int t=0;for (int i=1;i<=n;++i)if (f[i]==1){if (flag[i]){flag[i]=false;++t;}for (int j=1;j<=n;++j)if (flag[j]&&dis[i][j]<=lim[j]){flag[j]=false;++t;}}if (t==n) ans=min(ans,zhi);++HA;return;}f[x]=1;dfs(x+1,zhi+tim[x]);f[x]=0;dfs(x+1,zhi);
}
int main(){scanf("%d",&n);num=0;for (int i=1;i<=n;++i) scanf("%d",&tim[i]);for (int i=1;i<=n;++i) scanf("%d",&lim[i]);for (int i=1;i<=n;++i) f[i]=0;for (int i=1;i<=n;++i)for (int j=1;j<=n;++j) dis[i][j]=1<<29;for (int i=1;i<n;++i){int u,v,z;scanf("%d%d%d",&u,&v,&z);dis[u][v]=z;dis[v][u]=z;}for (int k=1;k<=n;++k)for (int i=1;i<=n;++i)if (i!=k) for (int j=1;j<=n;++j)if (k!=j&&i!=j)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);ans=1<<29;dfs(1,0);printf("%d\n",ans);return 0;
}

正解

DPdp[i][j]ij

bst[i]i

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int vet[4010],val[4010],Next[4010];
int hed[4010],vis[4010];
int dis[4010][4010],dp[4010][4010];
int tim[4010],lim[4010],bst[4010];
int num;
int n;
void add(int u,int v,int z){++num;vet[num]=v;val[num]=z;Next[num]=hed[u];hed[u]=num;
}void dfs(int x,int dis[]){queue<int> q;q.push(x);vis[x]=x;dis[x]=0;while (!q.empty()){int u=q.front();q.pop();for (int i=hed[u];i!=-1;i=Next[i]){int v=vet[i],z=val[i];if (vis[v]!=x){vis[v]=x;dis[v]=dis[u]+z;q.push(v);}}}
}
void check(int x,int fa){for (int i=hed[x];i!=-1;i=Next[i]){int v=vet[i];if (v==fa) continue;check(v,x);}for (int i=1;i<=n;++i)if (dis[x][i]<=lim[x]){dp[x][i]=0;for (int j=hed[x];j!=-1;j=Next[j]){int v=vet[j];if (v==fa) continue;dp[x][i]+=min(dp[v][i]-tim[i],bst[v]);}dp[x][i]+=tim[i];bst[x]=min(bst[x],dp[x][i]);}
}
int main(){scanf("%d",&n);for (int i=1;i<=n;++i) scanf("%d",&tim[i]);for (int i=1;i<=n;++i) scanf("%d",&lim[i]);for (int i=1;i<=n;++i){hed[i]=-1;vis[i]=0;bst[i]=1<<29;for (int j=1;j<=n;++j) dp[i][j]=1<<29;}for (int i=1;i<n;++i){int u,v,z;scanf("%d%d%d",&u,&v,&z);add(u,v,z);add(v,u,z);}for (int i=1;i<=n;++i) dfs(i,dis[i]);check(1,0);printf("%d\n",bst[1]);return 0;
}

http://www.ppmy.cn/news/632152.html

相关文章

告诉你什么是 Java 宏变量,别再疑惑不解了

小编第一次被问到这个概念时&#xff0c;确实是有点懵。入行没多久&#xff0c;莫怪莫怪&#xff01;后来翻阅一些资料和博客&#xff0c;才豁然开朗。 小编认为Java中其实没有关于宏的定义&#xff0c;《Thinking in Java》中我也没有找到相关的介绍。这个概念应该是从C语言中…

恶魔果实

组合题&#xff08;牛客&#xff09;: 恶魔果实. 题目描述 牛牛得到了一堆神奇的恶魔果实&#xff0c;每个恶魔果实都给了牛牛一个改变数字的能力&#xff0c;可以把数字a变成数字b&#xff0c;现在牛牛有一个数字x&#xff0c;他想知道吃完这n个恶魔果实后&#xff0c;他可以…

gcc宏展开

要把源代码中的宏展开&#xff0c;其实只要使用gcc进行预处理即可。 gcc -E source.c >out.txt -E表示只进行预处理&#xff0c;不进行编译。 预处理时会把注释当成空格处理掉&#xff0c;如果想保留其中的注释&#xff0c;可以加上-C选项&#xff0c;即&#xff1a; gc…

将一个宏被另一个宏使用

带参数的宏定义的一般形式如下&#xff1a; #define <宏名>&#xff08;<参数表>&#xff09; <宏体> 一.如下图 我想要计算一个三角形的面积 我要定义两个宏&#xff1a;一个用来表示&#xff1a;s1/2*(abc) 一个用来表示&#xff1a; (s-a)(s-b)*(s-c) …

NLP创业破局,如何摘取更高处的果实

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 2022年&#xff0c;云从科技、商汤科技先后登陆资本市场&#xff0c;计算机视觉四小龙中的旷视科技、依图科技也在摩拳擦掌。反观NLP领域&#xff0c;相关企业的发展速度、融资规模、上市进程仿佛都要略逊一筹&…

windows下cmake找不到glew、glfw等包的解决方法

错误的类型 这里就放一个glfw的错误图吧&#xff0c;glew报错的话和这个是一样的 找不到glew的解决方案 首先去官网下载glew编译好的文件&#xff0c;链接glew 之后解压如图&#xff0c;我们需要做的是复制bin的路径&#xff0c;我的路径为D:\code_study\glew-2.2.0-win32\gl…

cmake 一些有用的宏

一个开源项目&#xff0c;如果想依赖cmake的find_package规则来实现编译的自动查找&#xff0c;主要是<1>头文件路径<2>库名字<3>库路径这三个方面&#xff0c; 有2个办法&#xff1a; &#xff08;1&#xff09; cmake 有个 系统变量 CMAKE_ROOT 通常比如…

收获属于自己的果实

收获属于自己的果实 一个冬日的夕阳下&#xff0c;银杏树飘落的树叶像倦了的蝴蝶。在这棵银杏的对面有一个IT培训的基地。这里的老师“关爱”学生&#xff0c;学生刻苦努力的学习着&#xff0c;每一个来这里的人都是想着去往人生理想的方向前进&#xff01;他们不懈怠、不抱怨…