[洛谷P1268]树的重量
原题传送门
方法一
这道题是贪心。主要的难点在于合并路径压缩长度的策略。这里采用的方法是让一个个结点并入已经构建好的树中,并记录该结点接入树的位置、接入树到该结点的长度。模拟注意细节即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 8 #define re register 9 #define rep(i, a, b) for (re int i = a; i <= b; ++i) 10 #define repd(i, a, b) for (re int i = a; i >= b; --i) 11 #define maxx(a, b) a = max(a, b); 12 #define minn(a, b) a = min(a, b); 13 #define LL long long 14 #define inf (1 << 30) 15 16 inline int read() { 17 int w = 0, f = 1; char c = getchar(); 18 while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar(); 19 while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar(); 20 return w * f; 21 } 22 23 const int maxn = 30 + 5, maxw = 100 + 5; 24 25 int N, M[maxn][maxn], link[maxn][maxw], l[maxn], ans; 26 27 int main() { 28 while (N = read()) { 29 memset(M, 0, sizeof(M)); 30 memset(link, 0, sizeof(link)); 31 memset(l, 0, sizeof(l)); 32 rep(i, 1, N-1) 33 rep(j, i+1, N) 34 M[i][j] = M[j][i] = read(); 35 l[2] = M[1][2]; 36 rep(i, 3, N) { 37 l[i] = M[1][i]; 38 int p = 2, q = 0; 39 while (1) { 40 int del = min((l[i] + l[p] - q - M[i][p]) >> 1, l[i]); 41 q += del; l[i] -= del; 42 if (link[p][q]) p = link[p][q], q = 0; else break; 43 } 44 while (link[p][q]) p = link[p][q], q = 0; 45 link[p][q] = i; 46 } 47 ans = 0; 48 rep(i, 2, N) ans += l[i]; 49 printf("%d\n", ans); 50 } 51 52 return 0; 53 }
方法二
将以上方法进行抽象简化,不再模拟,直接统计即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 8 #define re register 9 #define rep(i, a, b) for (re int i = a; i <= b; ++i) 10 #define repd(i, a, b) for (re int i = a; i >= b; --i) 11 #define maxx(a, b) a = max(a, b); 12 #define minn(a, b) a = min(a, b); 13 #define LL long long 14 #define inf (1 << 30) 15 16 inline int read() { 17 int w = 0, f = 1; char c = getchar(); 18 while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar(); 19 while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar(); 20 return w * f; 21 } 22 23 const int maxn = 30 + 5; 24 25 int n, e[maxn][maxn], ans; 26 27 int main() { 28 while (n = read()) { 29 ans = 0; 30 rep(i, 1, n-1) 31 rep(j, i+1, n) 32 e[i][j] = e[j][i] = read(); 33 rep(i, 2, n) { 34 int l = INF; 35 rep(j, 1, i-1) 36 l = min(l, e[1][i] - ((e[1][i] + e[1][j] - e[i][j]) >> 1)); 37 ans += l; 38 } 39 printf("%d\n", ans); 40 } 41 42 return 0; 43 }
转载于:https://www.cnblogs.com/ac-evil/p/10322307.html
[洛谷P1268]树的重量相关推荐
- 洛谷—— P1268 树的重量
P1268 树的重量 构造类题目,看不出个所以然来... emmm,只好看题解: 只有两个点,那一条路径就是$ans$ 考虑三个点,那么$3$这个点相对于树上的路径(已经加入树上的边的距离) 为:$( ...
- 洛谷1268树的重量(树)
题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题是,根据物种之间的距离 ...
- 洛谷 P1411 树
最近在做些树形DP练练手 原题链接 大意就是给你一棵树,你可以断开任意数量的边,使得剩下的联通块大小乘积最大. 样例 8 1 2 1 3 2 4 2 5 3 6 3 7 6 8 输出 18 我首先想的 ...
- 洛谷 - P3374 树状数组1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 xx 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,mn,m,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...
- 洛谷 P3374 树状数组模板1
题目大意 给出一个初始数组,有两种操作,一种是将第x个数加上k,一种是求[x,y]区间和. 题目分析 直接暴力肯定TLE,我们可以用简单线段树或者树状数组优化,这里作者就采用简单线段树通过 #incl ...
- 洛谷.P3374 树状数组
题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m分别表示该数列数字的个数和操作的总个数. 第二行包含 n 个用 ...
- 洛谷P1873-砍树(二分答案)
题目描述: 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米 ...
- 洛谷P3384 - 树链剖分(树链剖分模板题)
题目链接 https://www.luogu.org/problemnew/show/P3384 [描述] 树链剖分模板题,记一下板子 #include<bits/stdc++.h> #d ...
- 洛谷 [P2590] 树的统计
迷之TLE #include <iostream> #include <cstdio> #include <cstring> #include <algori ...
最新文章
- Flutter开发之《头条 Flutter iOS 混合工程实践》笔记(54)
- tensorflow环境下的识别食物_Tensorflow object detection API 搭建属于自己的物体识别模型——环境搭建与测试...
- Dynpro F4的实现测试
- python2.7下面字节数组(ByteArray)和16进制字符串(HexString)转化
- 如何 更换vue的图标_vue如何实现图标点击选中后换一个图标(只单选)
- logging模块(* * * * *)
- wcf rest服务启用gzip压缩
- Reset Image Size 2
- 使用samba完成Linux服务器与Windows之间的映射
- 爬虫:爬取网页表格内容,写入scv文件并绘图
- WebRTC音频处理流程简介
- 萝卜内存对比工具使用说明
- 整数逆序输出, 例如输入一个整数12345,输出5 4 3 2 1
- Idear创建Maven项目
- Web Services Ksoap 下载多张图片
- C/C++实现双目矫正(不使用OpenCV内部函数)及矫正源码解析
- vue 使用vue-canvas-poster生成自定义海报
- 第十二章 洗筋伐髓
- 高清视音监控系统的实现
- 磁盘类型转换(fat转换ntfs)