ACM
文章平均质量分 61
lizy3838
啊啊啊
展开
-
zoj1093 dp入门
今天终于开始刷dp的题目了!题目大意:给出n种长方体和各自边长,每种长方体选择数量没有限制,放在上面的长方体要小于下面的长方体,问能够放多高。做法:每个长方体有三种摆放方式,把三种方式各看成一种长方体,把它们先按两条边长由大到小排序,然后枚举每个长方体,看能否放置在它之前的长方体下面,若能,记录其中最高的一种。状态:dp[i] 表示以 第i 个长方体为底所能搭的最大高度。转移方程: d原创 2016-02-05 19:07:18 · 496 阅读 · 0 评论 -
hdu2795 Billboard (机智的线段树点更新)
题目大意:在一块h层的广告牌上面贴广告,每个广告有一层宽,每个广告尽量往上往左贴。问贴的广告在第几层。 做法:这道题很机智的可以用线段树,把 1~h 层看作 线段 1~h ,树上每个节点记录线段的剩余长度最大值。贴广告时,若广告长度>左儿子节点,则进入做子树,否则看右儿子是否符合要求,若符合,则进入右子树。 以下是代码:#include #include #includ原创 2016-02-15 22:07:04 · 251 阅读 · 0 评论 -
poj2488 DFS基础
DFS基础题,题目大意是给出棋盘大小,问马能否走遍所有的格子。需要注意的是,题目要求按字典序输出路径,所以遍历时,要按照先从上到下再由左至右的顺序。这里开始把往上和往下的顺序搞反了。。一直WA。。还是太年轻。代码有些细节写得丑,大概就是这样。#include #include #include #include using namespace std;int a[40][40];原创 2016-02-02 14:22:29 · 334 阅读 · 0 评论 -
poj3278 BFS基础
题目大意为:给出农民坐标和奶牛坐标,可对农民坐标进行三种操作:+1 , -1, *2. 奶牛坐标不变,问农民到达奶牛坐标最少操作数。基础的BFS题#include #include #include #include #include using namespace std;queueq;int n,k;int a[1234567]; //用数组记录到达下标坐标所用的原创 2016-02-02 22:44:14 · 322 阅读 · 0 评论 -
hdu1698 Just a Hook(线段树区间修改)
一道线段树区间修改模板题,用lazy标记来减少对子节点的更新操作,由于最后是求总区间的价值和,所以都不用写 query 了,看别人有的用 map 写的一点点代码可以过,以后研究下。 以下是代码:#include #include #include #include #define N 400000using namespace std;int sum[N],lazy[原创 2016-02-16 17:49:39 · 219 阅读 · 0 评论 -
poj2362 dfs 剪枝 比水题难的题
这道题tel了一晚上。。看了题解后。。终于A掉了,题目大意是:给出若干根各种长度的棍子,问它们能否拼接成正方形(每根都要用上)。首先求出棍子长度的和sum。剪枝1:sum%4!=0 则答案一定为no。若sum%4==0,则棍子要组合出四根长度为 siz=sum/4 的边。剪枝2:只要判断能组合出3条边,答案即为yes。所有棍子长度按从大到小顺序排序,因为越长的棍子与其它棍子组合原创 2016-02-02 22:55:46 · 264 阅读 · 0 评论 -
poj1011 dfs 剪枝
这道题与poj2362类似,对剪枝的要求更多了原创 2016-02-03 12:33:44 · 360 阅读 · 0 评论 -
poj1088 dp 记忆化搜索 (入门好题)
题目意思很简单,一开始我直接DFS深搜,超时果果的,看了题解以后,学习了记忆化搜索,就是记录下已经求出的当前结点的最大值,在之后访问到这个节点时,就能直接调用结果,减少重复计算。是一道好题。以下为代码:#include #include #include #include using namespace std;int r,c,a[150][150],len[150][150原创 2016-02-03 22:38:46 · 2167 阅读 · 1 评论 -
poj2251 三维bfs
挺简单的一道题,直接往6个方向BFS就行了,通过这道题明白了:BFS过程中,把节点压入队列时就要标记这个节点,而不能节点取出后再标记,这样避免了很多重复的BFS。一开始交的时候一直WA。。结果发现是因为memset里面写错了。。汗死。。以下为代码:#include #include #include #include #include using namespace std;c原创 2016-02-04 16:49:18 · 274 阅读 · 0 评论 -
hdu1010 dfs+剪枝 (挺机智的题。。)
一道DFS+剪枝题,题目意思是问能否在规定时间到达出口(路径不能重复),一开始我以为在t时间内到达就行了。。果断写了一个BFS然后一直WA,一搜题解才恍然大悟。。。一个简单的DFS,剪枝部分很机智,根据起点终点还有规定时间的奇偶性质可以剪枝,然后最短路线和时间的关系可以剪枝。以下是代码:#include #include #include #include using names原创 2016-02-04 21:54:05 · 378 阅读 · 0 评论 -
CF681C 模拟
#include#include#include#include#include#include#includeusing namespace std;string s1 = "insert";string s2 = "getMin";string s3 = "removeMin";priority_queue , greater > q;struct node{原创 2016-07-29 08:50:32 · 874 阅读 · 0 评论 -
hdu1394 Minimum Inversion Number(树状数组求逆序数)
题目大意:给出一个数列,然后让这个数列滚动,求每种数列的逆序数,输出其中的最小值。 做法:用树状数组可做,把原数列由大到小加入树状数组,统计在这个数前面的已加入数的个数,求和,即为原数列的逆序数。数列滚动时,把第一个数字以至最后,那么,鑫逆序数为:原逆序数 - 数列中比它小的数字个数 + 数列中比它大的数字个数,最后可得方程 sum=sum-2*a[1]+n-1 ; 以下是代码原创 2016-02-15 16:26:08 · 273 阅读 · 0 评论 -
POJ3620
今天开始,每天学一些数据结构和算法,然后把暑假集训的作业题都刷一遍,跳过模拟和贪心,从搜索开始。poj3620 水题一道,dfs求连通块:#include #include #include #include using namespace std;int a[200][200];int xr[]={1,0,-1,0};int yr[]={0,1,0,-1};int原创 2016-02-01 22:01:17 · 283 阅读 · 0 评论 -
hdu1754 I Hate It (线段树点修改查询模版题)
中文题,线段树点修改查询的模版题。。没啥好说的,复习的时候敲一敲,熟练模版吧 以下是代码:#include #include #include #include #define N 1000000using namespace std;int maxx[N],_max;void pushup(int o){ maxx[o]=max(maxx[o*2],m原创 2016-02-14 10:58:50 · 237 阅读 · 0 评论 -
zoj1025 dp(呃。。)
这道题放在DP训练题组里,但是我用的贪心做出来的题目大意:问最少能用多少组非递减数列覆盖所给数列。。网上看的大多数做法和我差不多,排序好以后进行搜索与标记,然后就AC了。。并不知道在哪里用DP。。以下是代码:#include #include #include #include using namespace std;struct anode{ int len,原创 2016-02-05 21:12:54 · 430 阅读 · 0 评论 -
zoj1163 (很经典很好的DP)
啊啊啊啊啊啊短短不到30行代码看死我了,现在也没有完全理解,明天继续学习,DP之路还很长,ACM之路还很长状态 dp[i][j] 表示有 i 个积木时 最后一列不大于j个积木的总和。转移方程: dp[i][j]=dp[i-j][j-1]+dp[i][j-1];以下是代码:#include #include #include #include using namespace s原创 2016-02-05 23:42:52 · 730 阅读 · 0 评论 -
尚未解决 持续更新
poj1077 (双向BFS? 启发式搜索?)原创 2016-02-02 23:24:55 · 237 阅读 · 0 评论 -
csu1022 基础dp(数字三角形)
这个数字三角形只是比那个入门的数字三角形多了一条路而已,简单的dp状态 dp[i][j] : 第i行 第j列的最大和。转移方程 dp[i][j]=max{ dp[i+1][j] , dp[i+1][j+1] , dp[i+1][j+2] } + a[i][j];以下为代码:#include #include #include #include using namespa原创 2016-02-06 12:03:28 · 363 阅读 · 0 评论 -
csu1023 修路(二分查找)
一道中文题,对所需时间进行二分,可以得到答案,注意一下细节即可。以下是代码:#include #include #include #include using namespace std;int n,m,temp;int a[345];bool judge(int tim){ int ret=0,team=1; for(int i=0;i<n;i++){原创 2016-02-06 17:31:44 · 548 阅读 · 0 评论 -
csu1671 经营小卖部(DP 完全背包 好题)
这是一个完全背包问题,要分四种情况讨论:1.什么工具都不买 2.买微波炉 3.买冰箱 4.买微波炉 和 冰箱 。然后取其中利润最大的一种状态 dp[j] : 所给资金为j时的最大营业额。转移方程: dp[j]=max{dp[j],dp[j-ci]+wi} //这里的wi指的是单个物品的利润。以下为代码:#include #include #include原创 2016-02-06 21:33:49 · 284 阅读 · 0 评论 -
csu1673 集训队组队计划 (二分)
对最小差值进行二分即可,注意先把成员按照能力值排序,再进行寻找。以下为代码:#include #include #include #include #define INF 1e9using namespace std;int n,m,ret;int a[123456];bool judge(int num){ int temp=0; for(int i=原创 2016-02-06 22:22:29 · 223 阅读 · 0 评论 -
zoj1234 chopsticks 经典dp
经典的dp题,题目大意:给出需要的组合数量和一些筷子长度,每个组合要求 a 状态: dp[i][j], 表示第 i 根筷子 到 第 n 根筷子 有 j 个组合时的最小状态。 状态转移方程: dp[i][j]=min( dp[i+1][j] , dp[i+2][j-1] + (a[i]-a[i+1])^2 ); 选择这两个状态中的较小值,就是看要不要把第 i 根筷子 与 第原创 2016-02-12 17:41:23 · 432 阅读 · 0 评论 -
zoj1366 Cash Machine (多重背包基础)
一个裸的多重背包,把物品按二的幂分解,然后就转换成了01背包问题来求解,具体操作可参考《背包问题九讲2.0》。 以下是代码:#include #include #include #include using namespace std;int a[200];int dp[100010];int cn=0;void add(int num,int ww) //将一原创 2016-02-12 21:18:58 · 299 阅读 · 0 评论 -
zoj1409 Communication System (贪心+枚举)
题目大意:给出 n 种设备,每种设备有 m 个公司,分别知道每个公司的 带宽 和 费用,每种设备选择一个公司,求选择的 n 个公司中 最小的带宽/价格之和 最大是多少。 做法:枚举每一个公司的带宽作为最小带宽,然后在其它的每一种设备中,寻找比它带宽大的公司,取其中最小的费用。然后答案是所有枚举项里 B/P 最大的。 以下是代码:#include #include #in原创 2016-02-13 14:36:19 · 459 阅读 · 0 评论 -
CF621B 模拟
#include #include #include #include using namespace std;int d[5678];struct point{ int x; int y;}p[200005];int dia[5678],ddia[5678];//储存对角线上的鲨鱼数量int main(){ int n; scanf("%原创 2016-07-29 09:21:14 · 910 阅读 · 0 评论