zay大爷的膜你题 D2T2——不老梦(AK梦)
这个题。。。。。是最难的。。。。但是不知道为啥扶苏神仙讲完了之后我竟然听懂了。。。。
所以这个题我要好好写一写
首先我们看一看每一个测试点,来一点点得分
第一个测试点n = 1,直接输出w1就行,5分到手
第2-5个点,数据范围很小,我们可以打深搜
因为n = 8,所以即使是全排列也无非是8!,小的可怜,然后o(n)地check一遍是不是合法,所以最后的时间复杂度是O(n!n)
要考虑排列顺序一定是保证某个点的所有儿子都出现之后才能出现,否则不合法,而对于合法的排列,我们计算其w值,并且min(ans,w的和),最后输出ans即可,然后就又拿到了20分
第6-7个点,我们可以发现那玩意是个二叉树,这个就好办多了,
我们考虑这样一个东西
现在我们扫到了一个根节点为a的点,他有两个儿子分别是x,y,如果先进入x,那么我们需要的石子数就是W[x](指的是其子树的和)+w[a],同理,先进去y的话,我们需要的石子数就是W[y](指的是其子树的和)+w[a],假设w[y]更大的话,我们先进入y,当我们把y的子树放满了,我们就可以放y这个点了,在把y放上之后,我们可以把y的所有子树的石子拿出来扔到x的子树里去,这样不仅能不多用石子,甚至还有可能多余出石子放在a里,要是你先进x的话,就会导致你还得多带上w[y] - w[x]个石子,否则你将放不满y的子树,这样就不合法了
因为是二叉树,所以直接判断就好啦,最后所有答案加起来就是结果啦
测试点8-10,因为最多只有5个孩子,又因为n不算太大,我们可以暴力算出选孩子的顺序看那个最优秀,时间复杂度是O(5! n),说实话5! = 120的话,最后也不过是1e6多一点,正常跑就行了
测试点 11-14: 树高最多为 3。考虑进入第 3 层时由于不能回收石子,所以进入第三层的顺序无所谓,即对于第 2 层的每个节点 u,都有。现在只需要考虑从 1 号节点 进入它的所有孩子节点的顺序即可。 考虑走完节点 u 的所有孩子 v 所需要的总石子数 c[u],显然是越少越好。证明如 下: 走完所有孩子后,所花费的总石子数不变,设剩下的石子(也就是所需要的减去所 花费的)为 ret,注意到当 c[u] 最小的时候即是 ret 最小的时候。考虑当 ret ≥ wu 的时候,直接用 ret 放下 u 上的石子,于是放石子在节点 u 的总花费就是 c[u],后者 越小越好。 当 ret < w[u] 的时候,用剩下的石子放在 u 上,然后再额外放上去一些石子,这 样做的花费是
,这显然是最小的花费,考虑当 c[u] 越小 ret 才越小,c[u]取 最小时显然能取到最优情况。 综上,可以尽可能使 c[u]减小,来达到最优解。 那么问题变成了: 有 x 个商品,购买第 i 个物品需要手里有 ansi 元钱,花费 wi 元。求一个顺序 使得购买所有商品所需要的钱数最少。 这个问题的最最优顺序是按照
不升序购买,也就是差值越大越要先买。 考虑证明: 设有两个物品 i,j,设 ai=ansi-wi,aj=ansj-wj。且 ai>aj。考虑先买 i 再买 j 的 花费是 max(ansi, wi+ansj) ①,同理先买 j 的花费是 max(ansj, wj+ansi) ②。 提出 w,则 ①=wi+max(ai,ansj),②=wj+max(aj,ansi)=wj+max(aj,ai+wi)=wj+ai+wi。 考虑 ① 式的 max 如果取前面一项,则 ①=wi+ai<②,如果取后面一项则 ① =wi+ansj=wi+aj+wj<②,于是无论怎么取,①式恒小于②式,于是先买 i 更优。数学归纳法可得按照 ansi-wi 不升序购买最优。
最后贴一下代码吧
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- const int maxn = ;
- int n;
- int MU[maxn], ans[maxn];
- std::vector<int>son[maxn];
- void dfs(const int u);
- bool cmp(const int &_a, const int &_b);
- int main() {
- freopen("yin.in", "r", stdin);
- freopen("yin.out", "w", stdout);
- scanf("%d", &n);
- for (int i = , x; i <= n; ++i) {
- scanf("%d", &x);
- son[x].push_back(i);
- }
- for (int i = ; i <= n; ++i) {
- scanf("%d", MU + i);
- }
- dfs();
- for (int i = ; i < n; ++i) {
- printf("%d ", ans[i]);
- }
- printf("%d\n", ans[n]);
- return ;
- }
- void dfs(const int u) {
- for (auto v : son[u]) {
- dfs(v);
- }
- std::sort(son[u].begin(), son[u].end(), cmp);
- int _ret = ;
- for (auto v : son[u]) {
- if (_ret >= ans[v]) {
- _ret -= ans[v];
- } else {
- ans[u] += ans[v] - _ret;
- _ret = ans[v] - MU[v];
- }
- }
- ans[u] += std::max(, MU[u] - _ret);
- }
- inline bool cmp(const int &_a, const int &_b) {
- return (ans[_a] - MU[_a]) > (ans[_b] - MU[_b]);
- }
还有。。。。。。。c++11是个好东西可惜我不会。。。。。。。。
zay大爷的膜你题 D2T2——不老梦(AK梦)的更多相关文章
- zay大爷的膜你题 D2T1 江城唱晚
依旧是外链... 这一次网易云爆炸了....所以我决定后面的都用QQ 下面是题面 这道题是一道傻逼题 数学题,我们仔细看一看,首先有m朵花的话,我们就有m!种排列方式(也就是m的全排列), 然后我们假 ...
- NIOP 膜你题
NOIp膜你题 Day1 duliu 出题人:ZAY 1.大美江湖(mzq.cpp/c) [题目背景] 细雪飘落长街,枫叶红透又一年不只为故友流连,其实我也恋长安听门外足音慢,依稀见旧时容颜 ...
- NOIP 膜你题 DAY2
NOIp膜你题 Day2 duliu 出题人:ZAY 题解 这就是一道组合数问题鸭!!! 可是泥为什么没有推出式子!! 首先我们知道的是 m 盆花都要摆上,然后他们的顺序不定(主人公忘记 ...
- zay大爷的神仙题目 D1T3-膜你抄
依旧是外链 锦鲤抄 [题目背景] 你在尘世中辗转了千百年 却只让我看你最后一眼 火光描摹容颜燃尽了时间 别留我一人,孑然一身 凋零在梦境里面. ——银临&云の泣<锦鲤抄> [问题描 ...
- zay大爷的神仙题目 D1T2-腐草为萤
题面如下 依照旧例放外链 [题目背景] 纤弱的淤泥中妖冶颓废在季夏第三月最幼嫩的新叶连凋零都不屑何必生离死别——银临<腐草为萤> [问题描述] 扶苏给了你一棵树,这棵树上长满了幼嫩的新叶, ...
- zay大爷的神仙题目 D1T1-大美江湖
在前几天的时候,千古神犇zay(吊打zhx那个)出了一套神仙题目,所以我得来分析分析QWQ 先补个网易云链接QWQ 毕竟是T1嘛,还算是比较简单的,那道题,读完题目就发现是个中等模拟(猪国杀算大模拟的 ...
- 2017 ACM Arabella Collegiate Programming Contest div2的题,部分题目写个题解
F. Monkeying Around 维护点在多少个线段上 http://codeforces.com/gym/101350/problem/F 题意:有m个笑话,每个笑话的区间是[L, R], ...
- NOIP2016 玩脱记
NOIP前: NOIP前停课了一个多月,这一个多月里浪得飞起,内心十分紧张,然后就不知不觉就到NOIP了. Day 0: 上火车前ryc给我们出了道题"一个数列,只有两个数出现了奇数次,找出 ...
- 2015 CTSC & APIO滚粗记
o诶人太弱..... 记一发滚粗记以便治疗我的健忘症= = //文章会不定时修改,添加一些内容什么的...因此最好看一下刷新一下(因为有可能你正在看= =我正在写... 5.2 早上9点坐上长达11小 ...
随机推荐
- Juery入门2
1.Jquery操作文档 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- Linux本机和远程服务器之间文件的上传和下载 rz sz
tar zxvf lrzsz-0.12.20.tar.gz 解压安装包 下载地址:链接:https://pan.baidu.com/s/1KMS1QlyOhpXiYeaWdNBAyw 提取码:08 ...
- Python:JPG->JPEG
由于要在网页上使用图片渐进加载,所以需要将其他图片格式转化为JPEG格式 考虑使用python来实现批量转换 需要先安装pillow: pip install pillow 我这里将JPG格式转化为 ...
- 【洛谷P1730】最小密度路径
题目大意:给定一个 N 个点,M 条边的有向图,现有 Q 个询问,每次询问 X 到 Y 的最小密度路径是多少.最小密度路径的定义是路径长度除以路径边数. 题解:利用矩阵乘法,可以预处理出从 X 到 Y ...
- Quartz(二)
1 SchedulerFactory 1.1 概述 Quartz是以模块的方式构建的,因为,要使它运行,几个组件必须很好的组合在一起.非常幸运的是,已经有了一些现存的助手可以完成这些工作. 所有Sch ...
- Vue给子组件传值为空
在项目中会遇到的情况.给子组件传值. 子组件页面可以把数据展现出来.可在方法中却获取不到 解决方法: 父组件添加判断,让页面执行完.再把值带过去.
- JAVA笔记21-数组
一.数组内存分析 1.java中的数组是引用数据类型,必须分配在堆中,数组中每个元素相当于它的成员变量(默认值为0):但C中的数组可以分配在栈中.数组中的元素可以是基本类型,也可以是引用类型.如Str ...
- Python pickle模块学习(超级详细)
from http://blog.csdn.net/sxingming/article/details/52164249
- 8.django单独执行文件
import os import django # 导入django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'noju.settings')d ...
- vertical-greenplum
https://github.com/sumitchawla/docker-vertica You can either pull the image from Docker Registry usi ...