10 2012 档案
摘要:http://acm.fzu.edu.cn/problem.php?pid=1686题意:给定一个n*m的01矩阵,给出每次可以覆盖的行与列(相当于利用小矩形覆盖大矩形一样),求使用最少的次数(小矩形的个数)将所有的1都覆盖。思路:这里没有要求不能重复覆盖,所以属于重复覆盖的类型。只要把所有出现的1当作列,然后枚举每个可能的小矩形,枚举他所能覆盖的列,建立十字链标。然后套用DLX 重复覆盖模板即可。吐槽一下:这里h()函数减枝时如果是> 就会tle >= 就AC 了。。。无语了,看来等于的结果很多啊。心得:做了几个DLX的题目,感觉这类题目和网络流类似,只要能把模型想出来,建好图,
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=229题意:一个国家有n个城市,m个雷达,我们同时操作的雷达数最多为k,给出城市与国家的坐标,求小于等于k的操作下,雷达覆盖的能够覆盖所有城市的最小覆盖半径。思路:城市作为列,雷达作为行,二分枚举雷达的半径+DLX重复覆盖求解。View Code #include <cstdio>#include <cstring>#include <iostream>#include <cmath>using namespace std;// freopen("dat
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3372题意:给你一个n*m的大矩形,然后给你p个小矩形,让你从中选出若干小矩形填满这个大矩形,这里保证所选的小矩形不存在相互覆盖。思路:才开始看到大牛的dlx分类里面看了之后,没什么想法,可能就做了一个题的原因把。说是把整个大矩形的面积看n*m的作列,每个小矩形看作行,然后拆出他所能覆盖的列然后问题就转化成了DLX问题了。吐槽以下,这题我交了34遍啊。才开始自己想到了怎么写了就写了一下,中间出现各种错误, i : x1 到 x2 - 1 j: y1 + 1 到 y2 转化为本
阅读全文
摘要:#define CL(a,num) memset((a),(num),sizeof(a))#define inf 0x7f7f7f7f#define M 1007#define N 1000007const int head = 0;int u[N],d[N],l[N],r[N],c[N],row[N];int s[M],o[M];int ak,n,m;void init(int m){ int i; for (i = 1; i <= m; ++i){ l[i] = i - 1; r[i] = i + 1; u[i] = d[i] = i;...
阅读全文
摘要:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10702题意:给你一个n*m的01矩阵,让你选择若干行使这些行中的1能够覆盖所有的列,而且不能出现重复覆盖。输出所选的行。思路:这是跳舞链的模板题目。不多说了。给出个人觉得讲解比较好的链接:http://blog.csdn.net/mu399/article/details/7627736参考代码:http://blog.csdn.net/dooder_daodao/article/details/6654904我的代码:View Code #include <
阅读全文
摘要:http://codeforces.com/contest/231/problem/B题意:给你一个长度为n的序列每个元素的取值为[1,l] 然后进行如下操作,每次将 a[n - 1] - a[n] 替换a[n - 1]使原序列个数减1,最后得到一个数字d。给你长度n,最后得到的数d,和l。找去满足条件的序列。思路:这题真心不好想啊,首先我们能够退出 x1 - (x2 - (x3 - (.....)))得到x1 - x2 + x3 - x4 + x5 -... = d; 所以有(x1 + x2 + x3 ....) - (x2 + x4 + x6 + x8....) = d;这个公式,我想到这
阅读全文
摘要:http://codeforces.ru/contest/231/problem/C题意:给你n个数,你每次可以使其中的一个数加1,最多的加1次数为k,可以选择同一个数连续加但必须小于k。求使得小于等于k次加1操作后原序列中出现的相同元素最多的元素的个数,以及这个元素的值。思路:比赛时想了O(n^2)的做法写了一下超时,这是必然,我们首先对其进行从小到达排序然后枚举位置i ,从i - 1到1 枚举查看加到a[i]需要加1的次数直到k剩余个数不满足。这样的O(n^2)显然超时。要怎么优化呢? 开始想了二分枚举到底枚举什么自己糊涂了,没想到。这里看对于个数枚举。当我们枚举到 i 时,在区间[1,i
阅读全文
摘要:http://codeforces.com/problemset/problem/2/B题意:给定n*n的一个数字矩阵,求从左上角(1,1)走到右下角(n,n)将每个数字相乘,使得乘机中包含的0最少。要求只能往下走或者往右走。思路:状态转移方程很好看,关键是怎么保证所得乘积所含0个数最少。想一下如何才能使乘积中出现0呢?只有质因子2*5才能出现0,其余的质因子相乘不会出现。所以我们只要保证使得2与5的个数凑出来的10最少即可,即2与5的个数最少即可 我们肯定得到一条路线使得ans = min(2num,5num); ans的值在所有路线里是最小的。即得到了所得答案。开始我同时枚举的路线上的2与
阅读全文
摘要:http://codeforces.com/problemset/problem/159/C题意:给你一个字符串s,给出一个数k,k倍的s串组成新串str。然后给出n个操作,每个操作对应着pi,ci意思是将第pi个字符ci从str中删除,求最后得到的字符串。思路:首先我想到的是利用vector里面的erase快速的删除,开一个vc[26]来存取每个字符然后模拟删除过程,才开始自己一维erase的时间复杂度为O(1)如果这样肯定不会超时,结果事与愿违果真TLE了。问了问别人晚会上搜了搜原来erase函数的平均复杂度竟然是O(n)这样固然超时,可是看了看AC的代码里面也有用vector + era
阅读全文
摘要:http://codeforces.com/problemset/problem/237/E题意:给定一个目标字符串,然后给你n个字符串,从这n个字符串里面s1,s2,...sn,抽出字符组成目标字符串,每个字符串都对应这最多可以抽出a[i]个字符,抽取每个字符都有一定的费用,抽si里面的字符的话,每个字符需要i的钱数,判断目标字符串是否能够从这n个字符串里面抽出字符组成,若可以输出最小的费用,否则输出-1;思路:最小费用最大流。说实话看到这个题目时,真没网网络流方向想,比赛时时间也不够了,赛后一看tags 显示flows 才豁然开朗。 网流的题目关键还是能够看出如何建图,然后直接套模板即可。
阅读全文
摘要:http://codeforces.com/contest/237A:确实是水题,不过本人脑残,叫了四遍才对,第一遍读错题意些错了,第二边忘了去重定向,第三边去了重定向忘了保存(因为交的文件吗),四边忘掉了break。终于第五边对了。无语了。。粗心啊。。就是统计以下时间相同(同时到达咖啡店的人多少个即可)B:题意:给定一个有n行,每一行有ci个数的矩阵,求如何交换两个数使得矩阵满足a[i][j] > a[i - 1][j] && a[i][j] > a[i - 1][j]。思路:分析可知,如要满足条件我们只要将矩阵转化成一维的数组,使交换后的数组满足递增即可。开两个
阅读全文
摘要:http://codeforces.com/problemset/problem/216/C题意:在Berland法律规定每个工人的工作是这样的:它必须连续工作n天,然后休息m天,然后才能继续工作n天休息m天也即他的工作时间为[x, x + 1, ..., x + n - 1],[x + m + n, x + m + n + 1, ..., x + m + 2n - 1]Vitaly的工场必须保证每天有k个工人,而且还要保证在第n天时,有员工能够接任工厂钥匙。Vitaly想尽量少的雇用工人,以减少花费。求他最少雇用员工的个数以及他们分别在第几天雇用。思路:自己开了虚拟比赛做的题目,好不容易把A
阅读全文
摘要:http://codeforces.com/problemset/problem/216/B题意:有n个人,要求你将他们平均分成两组进行球赛。给出m个敌对关系,每个人最多有两个敌对的人,属于敌对关系的两个人不能分到同一小组里面。输出不能被分到两个小组最少人数。思路:和poj的食物链题目类似,这里利用并查集的长度记录关系,每出现一个敌对关系就将他们合并。距离为0表示可以属于同一组,1表示是敌对关系。当出现的两个敌对关系在之前已经确定为同类关系,必然将其剔除。记录剔除的个数,最后检查剔除这些人之后的人数是偶数。View Code #include <iostream>#include
阅读全文
摘要:http://codeforces.com/problemset/problem/4/C题意:一个注册系统,给出n个注册的名字,每次检查数据库中是否存在该名字,如果不存在返回OK,加入数据库,否如果存在在该名字后边加1,2,3,,,....然后加入数据库。思路:暴力存储查询可过,用字典数存处名字可过,哈希存储查找可过。暴力:View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#incl
阅读全文
摘要:http://codeforces.com/problemset/problem/232/A题意:给你一个数k,用n个点画出k个长度为3的环,然后输出n的个数以及图的矩阵表示,mat[i][j] = 0表示无边 1表示有边。思路:如果存在n点的话,则最多能够组合出的长度为3的环有c(n,3)个,当然这些特定的数,不能把k,全部表示出来,我们首先找出C(i,3)<=k的最大的i,然后不断往里面添加点,当我们添加一个点之后,我们可以从已有的图形里面的i个点里面选出2两个与刚加入的节点构成三元环,就这样枚举直到满足k个。View Code #include <iostream>#i
阅读全文
摘要:http://codeforces.com/problemset/problem/233/B题意:x2 + s(x)·x - n = 0, 给出n的值,求x的值,这里s(x)表示x各位数字的和。思路:才开始我错误的认为x^2 + s(x)*x 是一个单调递增函数,于是分析x<10^9然后二分枚举log(10^9)即可,结果写完后样例都没过。原来这个函数不是单调函数10 = 110 9 = 162 所以非单调。一时蒙了。还是做的数学题目比较少吧,思路还不够开阔。这里我能够得到x<10^9那么s(x)< 10*9 = 90 我们只要枚举s(x) 然后得到一个普通的一元二
阅读全文
摘要:http://codeforces.com/problemset/problem/91/B题意:给你n个数,求得i 到n中小于a[i]的最右边的a[j],然后求a[i]到a[j]之间包含了多少个数。思路:首先自己在做这道题的时候没有认真读题,直接把题意搞成求得i 到n中小于a[i]的最右边的a[j],然后求a[i]到a[j]之间包含了多少个小于a[i]的数了。。。结果样例都没过。唉自己还是太粗心,一定要认真把题意搞清楚,然后把想法想好了再敲。不过也算是做了另一道题目吧。首先我的思路,好像比较复杂。 我们利用线段树维护小于a[i]的区间[1,a[i]]的最大坐标值,当然要将数列离散话,因为a[i
阅读全文
摘要:http://codeforces.com/contest/236/problem/B题意:给定a,b,c三个数,d(i)表示i的因子的个数,求思路:任何一个数a都可以分解为素因子的乘积 a = p1^n1*p2^n2*p3^n3......然后他的因子的个数就为ans = (n1 + 1) * (n2 + 1)*(n3 + 1)....时间复杂度为O(n^3*x)这个x是多少真不知道怎么想,。还有一种方法是直接枚举1-100作为因子所能组成的数,每次组成该数就+1。最后直接的结果求和即可。View Code #include <iostream>#include <cstd
阅读全文
摘要:pku 1463Strategic gamehttp://poj.org/problem?id=1463题意:给定一个树,求在节点上放士兵来检查所有的线路。当i节点有士兵的时候,与i节点相连接的线路都可以被检测了。求所需的最少的士兵。思路:dp[i][0]表示i节点不放士兵,dp[i][1]表示i节点放士兵,dp[i][0] += dp[j][1] j是i的子节点 若果i节点未放士兵,则它的子节点必须放士兵dp[i][1] += min(dp[j][0],dp[j][1]) j是i的子节点 若i节点放了士兵,则它的子节点可放可不放。View Code #include <iostream
阅读全文
摘要:hdu 1712 ACboy needs your help 分组背包入门题目http://acm.hdu.edu.cn/showproblem.php?pid=1712题意:acboy今年有n门课程,给出每门课程他授课多少天能获得的利润,w[i][j]表示第i个课程他如果授课j天可获得的利润,求在m天内它能够获得最大利润。思路:每门课程看做一个分组,每门课程对应着m个物品可选,直接套用分组背包即可。View Code #include <iostream>#include <cstdio>#include <cstring>#include <alg
阅读全文
摘要:输入:可以从文件中输入,也可以从控制台输入。View Code import java.io.BufferedInputStream;import java.io.File;import java.util.Scanner;public class Demo { public static void main(String[] args) throws Exception { Scanner cin = null; cin = new Scanner(new File("data.in"));// 从文件读取 // cin = new Scann...
阅读全文
摘要:pku 1276Cash Machinehttp://poj.org/problem?id=1276题意:自动取款机里面的最大存钱量为cash,现在有n种不同价值的纸币,每个都有一定的数量,问这些纸币能够组合出来的小于等于cash的最大值。思路:典型的多重背包,转换01思想的做法TLE,只能用二进制倍增优化。View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <qu
阅读全文
摘要:pku 1384 Piggy-Bank 完全背包入门题目。http://poj.org/problem?id=1384这里只是求的恰好装满,且是最小罢了。在恰好装满时只要给f[0] = 0; 其他的一个未定义状态负无穷正无穷即可。View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include &l
阅读全文
摘要:pku 3624Charm Bracelethttp://poj.org/problem?id=3624最裸的01背包。View Code #include <cstdio>#include <cstring>#include <iostream>#define CL(a,num) memset((a),(num),(sizeof(a)))#define N 3405#define M 12888using namespace std;int c[N],w[N];int f[M];int main(){ int i,j; int n,m; scanf(&qu
阅读全文
摘要:hdu 1028 Ignatius and the Princess III 母函数模板题http://acm.hdu.edu.cn/showproblem.php?pid=1028题意:整数的拆分。母函数学习http://www.wutianqi.com/?p=596View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <
阅读全文
摘要:普通的并查集:pku 1308Is It A Tree?http://poj.org/problem?id=1308判断点的关系是否满足是一棵树,这里考察细节,注意:1:空的也是树;2:注意可能形成森林,森林就不是所描述的树了View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3473、题意:给定一个长度为n的序列,求区间[l,r]内的一个点值为x,使得最小。思路:很多解题报告都说找出区间[l,r]的中位数即可,可是我百度了一下中位数,他的定义是这样的:当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数,也即当N为偶数时,中位数就不一定属于该序列了。所以这里不是求得中位数。而是当N为奇数时得到中位数k,偶数时N/2(k)位置的那个数,也即这里保证x来自该序列。然后利用划分树求出区间[l,r]中小于k的个数以及他们的和,然
阅读全文