摘要:定义H数为4n+1,n>=0的数,H素数为H数中只能拆成1*x,x为H数的数,求1-n<=1000000中H素数的个数。 筛法。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<algorithm> 5 阅读全文
posted @ 2017-08-08 22:02 Blue233333 阅读(121) 评论(0) 推荐(0) 编辑
摘要:给出平面上n<=100个点,求最少用多少面积≤S<=200000的矩形能全覆盖。 第一想法是区间DP,f[i,j]表示覆盖第i到j的点最少矩形数,$f[i,j]=∑f[i,x]+f[x+1,j],x∈[i,j)$,但好在样例良心,这样的方案过不了样例。怎么把两个矩形相交的方案处理出来呢? f[i,j 阅读全文
posted @ 2017-08-08 06:56 Blue233333 阅读(372) 评论(0) 推荐(0) 编辑
摘要:n个数,分组,数Ai要在至少含有Ai个数的组,求最多分多少组。 方法一:大的数应该尽量跟大的在一起,这样才能让小的出现很多很多组,所以从大到小排序,给当前序列中最大的数x分x个数。代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<st 阅读全文
posted @ 2017-08-07 20:08 Blue233333 阅读(118) 评论(0) 推荐(0) 编辑
摘要:n<=100000个数表示每头牛在K<=30种物品的选取情况,该数在二进制下某位为0表示不选1表示选,求一个最大的区间使区间内选择每种物品的牛一样多。 数学转化,把不同状态间单变量的关系通过不等式移项转变为单状态的多变量关系。 sum[i,j]表示前i头牛有多少选了物品j,那么问题要求即对任意j∈[ 阅读全文
posted @ 2017-08-04 10:56 Blue233333 阅读(156) 评论(0) 推荐(0) 编辑
摘要:S<=50只股票D<=10天的价格给出,求第一天开始用n<=200000元最后能得到的最大钱数,保证答案<=500000。 做D次完全背包即可,每次做完把dp数组清空。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #i 阅读全文
posted @ 2017-08-03 11:17 Blue233333 阅读(266) 评论(0) 推荐(0) 编辑
摘要:n<=2000个数,把它修改成不上升或不下降序列所要改变的数值总共最小是多少yy一下可得最后改成的数值肯定是原数组数值中的某一个感觉一下,相邻两个数如果有冲突要改,那肯定把他们改成两者之一的数才较好,具体证明不会。。f(i,j)--前i个数,最后一个改为第j小(第j大)的数,答案是多少f(i,j)= 阅读全文
posted @ 2017-07-28 17:05 Blue233333 阅读(222) 评论(0) 推荐(0) 编辑
摘要:n<=500,n*n网格给m<=10000个点,每次发射子弹打掉一行或一列的点,求最少几发子弹。 网络流经典模型,每行每列看成点,一个(x,y)表示,表示第x行的点和表示第y列的点必有一个要选,连边。接下来二分图匹配或最大流即可。 1 #include<cstdio> 2 #include<cstr 阅读全文
posted @ 2017-07-28 16:22 Blue233333 阅读(137) 评论(0) 推荐(0) 编辑
摘要:n<=1000头牛各有一个未知值Ai,已知m<=10000条形如Ax>Ay的不等关系,求将整个序列排序的最少比较次数。 Aa>Ab,Ab>Ac > Aa>Ac,传递性,因此按m条不等关系连边建图,求出传递闭包,就是已知的关系。 求出传递闭包中的i≠j的0的个数即可。错误!连的图是有向图,而已知大于关 阅读全文
posted @ 2017-07-28 10:55 Blue233333 阅读(213) 评论(0) 推荐(0) 编辑
摘要:n<=100000个点m<=300000条边有权无向联通图,给出K<=10000个特殊点求K个点中任意两点最短路的最小值。 方法一:K小,随便搞。先构造最短路树,在最短路树上Dijkstra,遇到第一个特殊点就返回。代码如下: 如下个头。首先时间复杂度显然超了,其次建树时要考虑重边,比较难搞。 方法 阅读全文
posted @ 2017-07-27 17:26 Blue233333 阅读(147) 评论(0) 推荐(0) 编辑
摘要:n<=50000个点的树,求选最多不相邻点的个数。 f[i][0]=sigma max(f[j][0],f[j][1]),j为i的儿子 f[i][1]=sigma f[j][0],j同上 死于未初始化。不要歧视水题。 1 #include<cstdio> 2 #include<cstring> 3 阅读全文
posted @ 2017-07-26 17:39 Blue233333 阅读(144) 评论(0) 推荐(0) 编辑
摘要:n<=1000而m<=10000的DAG中求从n到1的前K<=100短路,不存在输出-1。 方法一:之前写过“第二短路”,比较2次;如果是要“前K短路”的话,dis需要是一个支持查找、插入(找到一个新的第u大,u<=K,需要插入u)、删除(插入后把最后一个删除)的东西,那就Treap或者Splay乱 阅读全文
posted @ 2017-07-26 17:15 Blue233333 阅读(268) 评论(0) 推荐(0) 编辑
摘要:len<=2000的字符串上,给出删掉和添加每种字符的花费,求把字符串变成回文串的最小花费。 首先每个字符添加和删除是一样的,因此花费在添加和删掉每个字符的花费中取小的。 如果每个字符的花费都是1,就是找最长回文串再用len减掉即可。(manacher!) 加了花费同理,就是找“最大权回文串”再用每 阅读全文
posted @ 2017-07-26 11:14 Blue233333 阅读(198) 评论(0) 推荐(0) 编辑
摘要:之前看了大神博客,感觉记住一幅画就能记得这个算法。。。 17.12.8 看图记不住。看代码 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 //#include<iostream> 5 using namespace st 阅读全文
posted @ 2017-07-25 09:32 Blue233333 阅读(196) 评论(0) 推荐(0) 编辑
摘要:n<=40000个<=m<=n的数,一段数不和谐(河蟹???)度为该段中不同数的个数的平方,求把n个数划成若干段后的最小不和谐度。 好题。首先可以确定是DP,f[i]=min(f[j]+P(j+1,i)),其中P(l,r)表示区间l到r的不同数的个数的平方。n2,过不了。 不过可以发现f是不下降的。 阅读全文
posted @ 2017-07-21 18:26 Blue233333 阅读(100) 评论(0) 推荐(0) 编辑
摘要:问n<=10000个点的中位数。 水题必有玄机!(然后浪费了半天在怎么O(n)求中位数并且最后放弃了) 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<cstdlib> 5 //#include<io 阅读全文
posted @ 2017-07-21 14:14 Blue233333 阅读(128) 评论(0) 推荐(0) 编辑