2012年10月12日

HDU 2795 Billboard

摘要: 题意:有一个h*w的广告牌,在这上要贴一些广告,每个广告的高度为一个单位,宽为WI,这样广告牌就可以分成h个层。逐个给出一些广告所占的宽度问你这个广告可以放在第几层(广告尽量靠上靠又)。题解:线段树。把每一层抽象成一个数,在这些数中找出一个层数最小且大于WI的数,并进行更新(当这一层被一个广告占用一部分时,这个数就减去相应的宽度)。这里还有个问题:h大到10^9,如果按给定的h建树的话肯定会爆内存!这里注意到n<=20,000,最多占用20,000行,所以只要按如下方式处理就可以了。if(h>n)h=n;AC代码:View Code 1 #include<cstdio> 阅读全文

posted @ 2012-10-12 21:57 Acmer_Roney 阅读(136) 评论(0) 推荐(0) 编辑

HDU 1009 Just a Hook

摘要: 题意:给你一列不同材质金属棒(金,银,铜),不同的材质价值不同(金-3,银-2,铜-1),起初金属棒全是铜的。对这些金属棒进行一系列的更换后问你全部的金属棒的总价值。题解:线段树+lazy。第一次我竟然写成了这样的。。。 printf("Case %d: The total value of the hook is %d.\n",++cas,val[1]);显然这是错误的!粗心了啊。。。正确的应是:printf("Case %d: The total value of the hook is %d.\n",++cas,Query(1,n,1,n,1)); 阅读全文

posted @ 2012-10-12 20:06 Acmer_Roney 阅读(162) 评论(0) 推荐(0) 编辑

poj 3468 A Simple Problem with Integers

摘要: 题意:给你一串数字,对这些数字有两种操作: 1.Q a b :问数字串从a到b的和。2.C a b c :对数字串a到b逐个加上c。题解:线段树+lazy。所谓lazy思想我的理解就是对于线段树的更新时仅仅在要更新的区间上标记一下,并不进行实际的更新操作,只有当要询问这一区间的信息时再更新。节省了不必要的更新操作。所以在查询时首先要做的就是查看标记这一段是否需要进行更新操做,然后进行相应的操作。AC代码:View Code 1 #include<cstdio> 2 #include<iostream> 3 #define LL long long 4 using nam 阅读全文

posted @ 2012-10-12 17:10 Acmer_Roney 阅读(155) 评论(0) 推荐(0) 编辑

2012年10月9日

I Hate It 1754

摘要: 题意不说了,中文都能看懂。。。题解:线段树的简单应用。建树,查找,更新。AC代码:View Code 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int maxn=10000000; 5 int maxs[maxn]; 6 int max(int a,int b){ 7 return a>b?a:b; 8 } 9 void build(int l,int r,int pos){10 if(l==r){11 scanf("%d",&maxs[ 阅读全文

posted @ 2012-10-09 12:05 Acmer_Roney 阅读(146) 评论(0) 推荐(0) 编辑

2012年9月28日

敌兵布阵 HDU 1166

摘要: 题意:有N个工兵营地,每个营地都有一定的人数,对于这些营地有如下操作: 1.询问从一个营地到另一个营地一共有多少人 2.在某个营地添加一定数量的人 3.在某个人营地减少一定的人。题解:线段树的基本应用。AC代码(可作模版): 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 const int maxn=50005; 6 int spt[maxn*3]; 7 int T,n,cas=0; 8 char s[10]; 9 void build(int l,int r,int pos){10 阅读全文

posted @ 2012-09-28 19:58 Acmer_Roney 阅读(172) 评论(0) 推荐(0) 编辑

2012年9月24日

Treats for the Cows POJ 3186

摘要: 题意:给你一串有序的数,从第一天开始每天只能从这串数的两端之一取一个数,并且你得到的价值是这个数乘以你取该数的天数。题解:DP。状态转移方程:dp[i][j]=max(dp[i+1][j]+v[i]*(n-(j-i)),dp[i][j-1]+v[j]*(n-(j-i)));这里dp[i][j]的意思是倒数第n-j+i次在剩下的未被取出的i~j区间内取一个数所能获得的最大价值。即第n-j+i次在i~j区间内要么取i要么取j。如果取i则dp[i][j]=dp[i+1][j]+v[i]*(n-(j-1)),否则dp[i][j]=dp[i][j-1]+v[j]*(n-(j-i))。显然dp[i][j] 阅读全文

posted @ 2012-09-24 17:42 Acmer_Roney 阅读(272) 评论(0) 推荐(0) 编辑

2012年9月21日

Function Run Fun poj 1579

摘要: 题意:把一个递归方程改为迭代的写法。题解:三重循环迭代递推。AC代码:View Code 1 #include<cstdio> 2 const int N=25; 3 int a,b,c,dp[N][N][N]; 4 int solve(){ 5 if(a<=0||b<=0||c<=0)return 1; 6 if(a>20||b>20||c>20)a=b=c=20; 7 for(int i=0;i<=a;i++) 8 for(int j=0;j<=b;j++) 9 for(int k=0;k<=c;k++){10 ... 阅读全文

posted @ 2012-09-21 21:30 Acmer_Roney 阅读(151) 评论(0) 推荐(0) 编辑

Zipper poj 2192

摘要: 题意:给你三个字符串,问你能否由前两个合成第三个,且要求不改变前两个字符串的顺序。题目保证第三个字符串的长度为前两个字符串的长度之和。题解:此题用暴力,深搜都可以过(数据太水)。这里给出DP的解法。dp[i][j](bool 型)代表第一个字符串的前i个字符和第二个字符串的前j个字符能否合成第三个字符串的前i+j个字符串。则状态转移方程为:1 if(dp[i-1][j]&&s1[i]==sum[i+j]||dp[i][j-1]&&s2[j]==sum[i+j])2 dp[i][j]=true;对于状态方程的解释:1.若第一个字符串的前i-1个字符和第二个字符串前 阅读全文

posted @ 2012-09-21 20:06 Acmer_Roney 阅读(259) 评论(0) 推荐(0) 编辑

How to Type HDU 2557

摘要: 题意:给你一串字符串,只包含大写字母和小写字母,问打出这串字符最少要按多少次键。但如果Caps Lock键最后是打开的一定要把Caps Lock键关掉。题解:首先你要知道1.当Caps Lock键关闭的时候打出一个大写字母可以有两种方法:1.按下Caps Lock键再按字母键 2.按Shift键并按字母键。2.当Caps Lock键打开的时候打出一个小写字母也有两种方法:1.按下Caps Lock键,再按字母键 2.按Shift键并按字母键。 题目涉及Caps Lock键的两种状态:关闭和打开。因此可以开一个二维数组,一维表示Caps Lock键关闭,另一维表示Caps Lock键打开。但这里 阅读全文

posted @ 2012-09-21 16:27 Acmer_Roney 阅读(337) 评论(0) 推荐(0) 编辑

Worm HDU 2151

摘要: 题意:有N棵树,一条毛毛虫一分钟会从一棵树上爬到相邻的另一棵树上。问你毛毛虫从起始位置P经过M分钟后爬到T棵树一共有多少种方法。(树从1到N编号)。题解:DP。状态转移方程:dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];dp[i][j]表示在第i分从P爬到树j的方法总数。这个状态转移方程很好理解,只要注意一下边界的处理和初始化就好了。具体见代码~AC代码:View Code 1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm& 阅读全文

posted @ 2012-09-21 15:03 Acmer_Roney 阅读(278) 评论(0) 推荐(0) 编辑

导航