随笔分类 - HDU/HDOJ
摘要:POJ 2528 求没有被完全覆盖的海报(不知道是不是这个意思)有多少张。注意题目一开始给的数字不是线段的端点而是线段。所以离散化的时候需要先处理,也就是把右端点+1.然后离散化,插入的时候应该插入线段,所以应该插入(left, right-1)。然后查询只需查询一次,标记即可。 ZOJ 2301, HDU 1199 做法是一样的,都是一维线段树,比较好处理。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <cmath>
阅读全文
摘要:题意:每次交换数组相邻的两个位置的值,耗费是两个值的和。求使数组排序的最小花费; 解法:树状数组; 我的做法是从后往前遍历数组,对a[i],求出比a[i]小下标却比i大的元素个数x,然后求出这x个值的和temp,sum(a[i]*x+temp)(1<=i<=n)即为所求。至于为什么要这样做,原因很简单,大家都知道最少的交换次数是求逆序数。但是总花费最小是不是也是这样求?答案是:是。 这是可以证明的,因为每次只能交换相邻的两个数,所以只要存在a[i]>a[j](i<j)则a[i],a[j]则至少会交换一次。所以当他们只交换一次的时候总花费是最小的。 还有一个需要注意的地方
阅读全文
摘要:题目传送门:http://poj.org/problem?id=1564 http://acm.hdu.edu.cn/showproblem.php?pid=1258 解法:深搜+判重 n<=12直接深搜也不会超时,而且数据较弱。题目意思说每个加法中的数字可以出现的次数不能多于原来list里面的数字。但是可能出现一样的加法式子。比如样例中的4 6 4 3 2 2 1 1,如果直接深搜就会出现两个3+1和两个2+1+1,所以加一个判断重复就可以了。类似的搜索还可以采用状态压缩的解法,效率更快。#include <iostream>#include <cstdio>#
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1565 题目意思就是说给出一个n*n的棋盘,每个位置上有一个非负整数,在上面取不相邻的若干个数,使得和最大。 解法:位运算+dp 因为每行可以取的位置都是一样的,只要两个数不相邻即可。所以可以先对1<<n以内处理,筛除不合法的,优化效率,然后对每行的每一个状态,在上一行合法而且跟本状态不冲突的所有状态中找一个和最大的。本行的本状态的值就是这一行在这个状态下取得的所有数的和+这个最大值。如果是第一行,则上一行的最大值为0; 需要注意的一个地方就是n可能为0,(>_<)我看了d
阅读全文
摘要:题目出处:http://acm.hdu.edu.cn/showproblem.php?pid=1074 dp状态压缩入门题,大牛无视。解法dp+状态压缩。参考hh大牛的这个图,http://www.cppblog.com/notonlysuccess/archive/2009/02/18/74168.aspx便于理解。题目的数据规模是15,本来采用了枚举和深搜的方法竟然都超时了。按理说不该吧。对状态压缩一无所知,参考了大牛们得解题报告,基本上是一样画葫芦写出来的。 对[1,1<<n)枚举每个值,当成是一个状态,保存到达这个状态也就是完成这个状态的作业被扣掉的最小学分。比如7的二进制
阅读全文
浙公网安备 33010602011771号