January 2013
文章平均质量分 65
ZuXu
这个作者很懒,什么都没留下…
展开
-
ZOJ 3678 The Toy of Flandre Scarlet
题目大意是有L*W*H个1*1*1的小方块,堆成长L,宽W,高H的玩具。每个小方块上有一个数字,每次我们可以让某相邻的两个小方块,同时加上或减去一个相同的数字。问经过若干步后能不能使所有数字均为0。 显然可以转化成图来考虑。假设A, B, C, D依次相邻,分别对应1,2,3,4。经过三次操作,AB-1,BC+1, CD-1,可使D=D-A,A=0;通过两次操作,BC-2,CD+2,可使D=D+原创 2013-03-25 19:43:07 · 3598 阅读 · 0 评论 -
ZOJ 3682 E - Cup 3
二维DP,用a[i][j]表示前i个广场容纳j个球迷的方案数,这里的球迷或为Barcelona,或为Madrid。由于题目保证两队人数与广场总容量相等,则可选择人数较少的队DP。不过这样的话用来存储中间结果的二维数组过大,为200*100000*4Byte,刚好约是内存限制的1.25倍。开始想用map<pair<int, int>, int>节约内存,结果超时,故而重新用滚动数组写了一遍。原创 2013-03-25 22:30:00 · 857 阅读 · 0 评论 -
ZOJ 3681 E - Cup 2
又是DP问题,又是内存不够,可惜这道题却能用map过掉。将M分解成a*b,则dp[M]=min(dp[a]*(b/2+1), dp[b]*(a/2+1))。(a|b)/2+1是level1中最少支持意大利的组数。 #include #include using namespace std; map mem; int dp(int num) { int& res = mem原创 2013-03-26 00:29:31 · 788 阅读 · 0 评论 -
ZOJ 3684 Destroy
首先中心应当位于整棵树的直径上,先从任意点开始搜一条最长路径,该路径的终点必是直径的一段,以上结论由反证可推出矛盾。再从端点开始深搜可得直径,遍历该路径即可得到中心点所在。接下来以中心点为根节点,开始DP即可。 #include #include #include using namespace std; #define it map::iterator struct roa原创 2013-03-27 21:34:59 · 727 阅读 · 0 评论