城堡

[无聊测试室] T2 积木城堡

大城市里の小女人 提交于 2020-03-21 04:46:28
典型的背包问题.对于每组积木跑一个背包,然后全盘跑一遍找到最大的值使得每组积木都有相应的值 要存n组积木,由于n<=100,并且每组最多只有100个积木,每个最长不超过100,故用dp[100][10000]存储可以通过 #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 1e2+5; int n,ans; bool dp[MAXN][MAXN*MAXN]; inline void update(int curr, int num){ for (int i=MAXN*MAXN-2;i>=0;i--){//倒叙跑背包 if (i-num<0) return; if (dp[curr][i-num]) dp[curr][i] = true; } } inline void solve(){ cin >> n; memset(dp,0,sizeof(dp)); for (int i=0;i<n;i++){ int c; cin >> c; dp[i][0] = true;//拿0个肯定可以 while(c!=-1){ update(i,c); cin >> c; } } for (int i=0;i<MAXN*MAXN;i++){ for

2020年数学建模美赛-B题翻译

女生的网名这么多〃 提交于 2020-03-10 14:20:09
2020 MCM 问题B:最长的沙堡 在世界上有休闲沙滩的任何地方,似乎都有儿童(和成人)在海边制作沙堡。使用工具,玩具和想象力,沙滩行人创造了沙堡,沙堡的范围从简单的沙丘到实际城堡的复杂复制品,其墙壁,塔楼,护城河以及其他模仿真实城堡的特征。在所有这些方面,通常会形成一个初始的基础,该基础由一个单一的,无形的湿沙丘组成,然后将其切割并成形为可识别的3维几何形状,从而在其上构建更具城堡意义的特征。 不可避免的是,海浪的流入加上潮汐的上升侵蚀了沙堡。但是,即使建造的沙子大小和距离同一海滩的水面距离大致相同,似乎并非所有沙堡对海浪和潮汐的反应方式都相同。因此,人们想知道是否存在用于沙堡基础的最佳3维几何形状。 要求: 1.构建数学模型以识别最佳的3维几何形状,以用作沙堡基础,该沙丘基础将在以下情况下在经历波浪和潮汐的海滨上持续最长的时间: •与同一海滩上的水大致保持相同的距离,并且 •使用相同类型的沙子,大致相同的沙子量和相同的水砂比例建造。 2.假设您不使用其他添加剂或材料(例如塑料或木制支撑物,石头等),请使用模型确定城堡基础的最佳沙水混合比例。 3. 根据需要调整模型,以确定需求1中确定的最佳3维沙堡基础如何受到雨水的影响,以及在下雨时它是否仍保留为用作城堡基础的最佳3维几何形状。 4. 您还可以使用其他哪些策略来延长沙堡的使用寿命? 5. 最后,写一篇内容丰富的一到两页的文章

hdu1561 The more, The Better(树形Dp+01背包)

感情迁移 提交于 2020-03-03 22:21:18
题意: Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? 分析:与前面的倆道树形dp相比,本题目多了一个限制条件,就是选M个节点,这个很自然的联想到了背包问题,那么要如何在树上做一个01背包呢? 先不考虑森林的情况,对于当前这一棵树,就是由以当前节点为根的树出现过的状态跟一棵子树上出现过的状态进行组合 for(int j=t;j>=1;j--) { for(int k=1;k<=now;k++) dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[w][k]); } //个人觉得t和now这俩个变量才是这题目的关键,t为当前遍历过的节点总数,不包含以w为根的树 //这俩个变量主要是处理哪些状态会影响到当前状态的转移的问题。 //换句话说,在当前状态下,就是以u为根的树,要选上以w为根的树上的城堡,那么,能出现的状态就是由 //以u为根的树上出现过的状态数t跟w为根的树上出现过的状态数now组合出选上之后的状态 //可能解释的有点累赘了 dp[u][j]表示以u为根的树

HDU 1561 The more, The Better【树形DP】

只谈情不闲聊 提交于 2020-03-03 22:20:55
Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input 每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。 Output 对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。 Sample Input 3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0 Sample Output 5 13 转:分析: 状态 dp[i][j] 为以 i 为根节点,选出 j 个节点的最大价值(包括 i 这个节点) 转移方程:dp[i][j]=max(dp[i1][j1]+dp[i2][j2]+....+dp[ik][jk])+a[i] j1+j2+...+jk=j

HDU 1561 The more, The Better[树形dp/01背包]

与世无争的帅哥 提交于 2020-02-29 12:55:11
The more, The Better 时限:2000ms Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input 每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。 Output 对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。 Sample Input 3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0 Sample Output 5 13 从节点0出发,找到经过m个节点的最长链,实际上是m+1个节点,因为每次都要从0节点开始。从树的下面开始dp。 dp[u][w]表示在u的子树上选择w个节点,u节点是必选的。

HD1561The more, The Better(树形DP+有依赖背包)

吃可爱长大的小学妹 提交于 2020-02-29 12:54:55
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6765 Accepted Submission(s): 3978 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input 每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。 Output 对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。 Sample Input 3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6

hdu 1561(树形DP+背包)

為{幸葍}努か 提交于 2020-02-29 12:48:50
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6992 Accepted Submission(s): 4100 Problem Description ACboy 很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原 因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input 每 个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。 Output 对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。 Sample Input 3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7

HDU1561:The more, The Better(树形DP+01背包)

孤人 提交于 2020-02-29 12:48:00
Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input 每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。 Output 对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。 Sample Input 3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0 Sample Output 5 13 题意就不多解释了,毕竟中文题 思路我也是参考的别人的代码,因为这道题结合了01背包的思想,一开始没有想到 #include <stdio.h> #include <string.h> #include <algorithm> using namespace

HDU 1561 The more, The Better(树形DP+01背包)

醉酒当歌 提交于 2020-02-29 12:44:44
The more, The Better Time Limit : 6000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 33 Accepted Submission(s) : 25 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input 每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。 Output 对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。

codeforces1271D 2100分贪心

狂风中的少年 提交于 2020-02-15 06:55:00
题目传送门 题意: n个城堡,m条单向边,单向边的方向永远是下标大的城堡到下标小的城堡。 初始时你的军队有k个士兵。 现在你依次占领n个城堡,占领顺序是先占领下标小的城堡,再占领下标大的城堡。 占领第 个城堡,需要拥有 个士兵,但是并不消耗士兵。占领第 个城堡后,你的军队会新增 个士兵。 保卫第 个城堡会获得 个金币。 保卫一个城堡需要把一个士兵留在该城堡。 军队的移动顺序是下标小的城堡到下标大的城堡,不会反向移动。 当你在第 个城堡时,你可以派一个士兵保卫第 个城堡。 当你在第 个城堡时,你可以派一个士兵保卫第 个城堡。要求必须存在第 个城堡到第 个城堡的单向边。 一个士兵保卫城堡就会离开军队。 如果不能占领所有城堡,那就输出-1。 问你在占领所有城堡后最多能获得多少个金币。 数据范围: 。 。 题解: 需要观察到2个切入点才能解决。 切入点1:如果要把一个士兵安排到第 个城堡,那么一定要保证能占领后面所有的城堡。 切入点2:如果要把一个士兵安排到第 个城堡,那么一定是合法的最靠后的城堡向第 个城堡派士兵。 因此,每个城堡都对应一个可向自身派遣士兵的最靠后的城堡。 依次保卫金币数最多的城堡即可。保卫该城堡后,要满足可以占领所有城堡。 感受: set用错,直接调了两个小时bug。 欲哭无泪。 代码: #include<bits/stdc++.h> using namespace