-------------POJ-------------
文章平均质量分 55
I_AM_HelloWord
爱好编程信息学
展开
-
POJ——2481
●Poj 2481●给你 n 个闭区间,问每一个区间被多少个区间完全包含(完全重合不算)。●n●Time Limit : 1s●Memory Limit : 256MB这应该算是一类套路题。对于区间覆盖型问题,普及难度的是贪心,再难一点点就是dp,提高难度的算是数据结构维护一下,如果是dp+数据结构,蒟蒻觉得应该要上省选了= =这里还是一个树状数组搞一搞原创 2017-08-17 10:40:20 · 338 阅读 · 0 评论 -
poj之旅——2566,2739
2566:从数列中找出连续序列,使得和的绝对值与目标数之差最小2739:将一个整数分解为连续的素数之和,有多少种分法题解:非常简单的尺取法解题即可。参考程序:2566:#include#include#define maxn 110000#define INF 0x7f7f7f7fusing namespace std;struct P{ int sum,id;原创 2016-06-13 16:21:37 · 199 阅读 · 0 评论 -
poj之旅——3273,3104
二分题最大值最小化的模式:设[l,r],l为最小可能(表示不一定可行)可行数,r为最大可行数。设mid,然后check(mid),依照题目意思,不可行则l=mid+1,否则r=mid。参考程序:3273:#include#define maxn 110000typedef long long LL;LL in[maxn];int n,m;bool Check(int k)原创 2016-06-06 18:59:24 · 75 阅读 · 0 评论 -
poj之旅——3258C++
二分题的模式:[l,r)的左端点l为最小可行数,r为最大可能可行数+1,中位数check(mid),true则趋向问题的求大求小,false则反向,最后输出l。参考程序:#include#include#define maxn 51000using namespace std;int p[maxn];int L,n,m;bool Check(int k){ int原创 2016-06-05 11:31:09 · 293 阅读 · 0 评论 -
poj之旅——3484
题目描述:给出若干组数据,每组数据包括若干个数列,数列给出首项x[i],末项y[i],公差z[i],问对于每组数据的所有数列中,出现奇数次的数字是多少,以及出现了多少次。题解:此题堪称继数论以后,第一坑的题目。首先读入把人难倒了——先用gets读一行,再判断字符串的长度,若为0则表示一组新数据的开始,不为0则用sscanf转化成int类型,对于初学C++的新手。。泪奔。。。原创 2016-06-12 12:56:25 · 364 阅读 · 0 评论 -
poj之旅——1759
题目描述:给出数列H的首项A,通向公式为h[i]=(h[i-1]+h[i+1])/2-1,求第n项的最小值。题解:先将公式变形:h[i+1]=2*h[i]+2-h[i-1],通向公式都给出了,只需枚举第二项,即可递推出,很明显第二项越小,最后的值才会变小,二分第二项即可。参考程序:#include#define maxA 1100#define maxn 1100原创 2016-06-10 12:29:27 · 222 阅读 · 0 评论 -
poj之旅——2429,3641,1995
快速幂3641:费马小定理,快速幂加素数判断。1995:求几个数的幂的和的模。模拟型题。参考程序:3641:#include using namespace std;typedef long long LL;LL mod_mult(LL a, LL b, LL m){ LL res = 0; LL exp = a % m; while (b) { if原创 2016-06-05 10:49:33 · 268 阅读 · 0 评论 -
poj之旅——3126,3421,3292
清一色的筛质数,数论有点麻烦,题目又是英文的,看不懂欸,看来学英语很重要啊。参考程序:3126:#include#include#include#include#include#define maxn 11000using namespace std;struct Prime{ int f[maxn]; bool ok[maxn]; int n; int cnt;原创 2016-06-04 19:15:54 · 228 阅读 · 0 评论 -
poj之旅——1065
题目描述:有一些木棍,每个有长度和重量,要求把这些木棍排成若干两个属性值均不下降的序列。问至少要分为多少个序列题解:此题用贪心应该是可以过的,毕竟网上有人发出题解打的是贪心,但是在《挑战。。》一书中放在了dp的一章,可以思考如何用dp做。 我们先将长度按递增排序,那么就简化问题,只需求其重量的序列即可。 我们假设在整个序列中的最长下降序列的长度为L,最终答案原创 2016-05-23 13:03:17 · 256 阅读 · 0 评论 -
poj之旅——3662
题目描述:N个电线杆P条线可选,K条线内免费,否则花费免费额度外最长的那一根。求最小花费题解:二分答案,模式同最大值最小化。Check(mid):建图。因为mid可能就是结果,故将原图按照边权是否大于mid重新建图,用dijsktra求1到n的最短路,d[n]即表示所需免费数,与k比较大小,调整l与r。参考程序:#in原创 2016-06-09 16:37:58 · 251 阅读 · 0 评论 -
poj之旅——3181
题目描述:农夫约翰有N元钱,市场上有价值1……K的商品无限个,求所有的花钱方案题解:很明显的无限背包,定义dp[i][j]表示用前i个价值的商品花费j元,则有dp[i][j] = dp[i – 1][j] + dp[i][j – i]参考程序:#include#include#define Limit 100000000000000000using n原创 2016-05-22 18:37:14 · 240 阅读 · 0 评论 -
poj之旅——3579,3685
接着上次的旅行。此为查找第k小的数的一类题型,基本模式可同最小值最大化。参考程序:3579:#include#include#define maxn 110000using namespace std;long long half;int n;int a[maxn];bool Check(int mid){ long long sum=0; for (int i=原创 2016-06-09 12:47:35 · 259 阅读 · 0 评论 -
poj之旅——2976C++
二分法解决最大平均值的模式:设[l,r)为可行区间,l表示最小可行数,r表示最大可能可行数,取mid,Check(mid),可行则l=mid,否则r=mid。Check(mid):设平均值为mid,如果可行的话,则有x=sum{a[i]}/sum{b[i]}最优解>mid,所以mid即mid*sum{b[i]}sum{a[i]}-mid*sum{b[i]}>=0sum{原创 2016-06-08 12:19:13 · 329 阅读 · 0 评论 -
poj3045.cpp
题目表面是最大值最小化的问题,但由于顺序不确定,不适宜二分,显然《挑战程序设计竞赛》出现了瑕疵。但肯定能用已有知识解决。只需按照w+s从小到大排序,证明如下:可以利用反证法。> > 1)A站在B的上方,A的承重为m,B的承重为m + A.w。> 2)调换AB的位置,那么B的承重为m,A的承重为m + B.w。> > 如果A.s + A.w < B.s + B.w,> 并原创 2016-06-07 12:22:39 · 63 阅读 · 0 评论 -
poj之旅——1930
题目描述:简单的小学奥数题。枚举循环点。参考程序:#include#include#include#include#include#define INF 0x7f7f7f7fusing namespace std;typedef int ULL;ULL gcd(ULL a,ULL b){ if (!a)return b; return gcd(b%a,a);原创 2016-06-02 13:13:39 · 381 阅读 · 0 评论 -
poj之旅——3046
题目描述:有A只蚂蚁,来自T个家族。同一个家族的蚂蚁长得一样,但是不同家族的蚂蚁牙齿颜色不同。任取n只蚂蚁(S题解:简单的定义 dp[i][j] := 使用前i个家族可以配出来“元素个数为j”的集合的个数。那么dp[0][0] = 1,不使用任何蚂蚁配出空集的个数为1。递推关系式:dp[i][j] = ∑0family[i]dp[i – 1][j –原创 2016-05-20 12:59:08 · 213 阅读 · 0 评论 -
poj之旅——2100
题目描述:给出正整数n,求有多少组完全平方数的和恰好为n题解:一般对于结果单调,且求恰好等于某个数的问题,采取尺取法解决,即左右区间先后移动,一定程度上有贪心的意味。 而对于求某个变量的最值,则采取二分法,相同点都是维护l,r的区间。参考程序:#include#include#includeusing namespace std;typedef原创 2016-06-13 23:06:21 · 233 阅读 · 0 评论 -
poj之旅——3185
题目描述:将一列碗翻成口朝上,一把下去可能同时反转3个或2个(首尾),求最小翻转次数题解:1.非常简单的枚举结果。可以过。 2.其实,很明显只需枚举是否反转第一个碗即可,其他的碗可以一步一步推导。参考程序:#includeint num[21],step,flag;int range(){ int i; for(i=0;i<20;i++)原创 2016-06-14 10:03:55 · 275 阅读 · 0 评论 -
poj之旅——1222
题目描述:给出5*6的01图,每个01按一下,周围五个全部反过来,问怎样能使全部变成0题解:对于翻转型题目,一般枚举一小部分,因为无后效性,就可以递推出整个方案。 对于平面型,一般枚举第一行,由第一行形式的确定,推导第二行。参考程序:#include#include#define maxn 120int now[maxn][maxn];int原创 2016-06-14 13:38:09 · 296 阅读 · 0 评论 -
poj之旅——2104
题目:给出一个数列,对于每个查询(i,j,k),输出ai.....aj中排序后第k个数。分析:其实就是线段树的运用。二分答案,然后对于i...j计算小于k的数字个数,这个用线段树模拟归并排序,然后如果当前区间被i....j包含,那么就返回这个区间的二分后的结果,否则查找子区间。跟AC的程序对拍十几个极端数据,可是死都不过,不懂。线段树就是我的克星。参考程序:#i原创 2016-11-14 20:48:50 · 253 阅读 · 0 评论 -
poj之旅——1050
题目描述:给出一个矩阵(100×100)求一个子矩阵,使得子矩阵中各个元素的和最大题解:四重循环预处理10^8,效率不够;如何做到三重循环呢?枚举矩阵的起始行与终止行,然后将行之间的数字累加成和,压缩成一行数字,然后求这行数字的最大子序列即可。参考程序:#include#include#includeusing namespace std;int原创 2016-10-20 21:50:07 · 250 阅读 · 0 评论 -
poj之旅——1018
题目描述:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。其中B为这n件设备的带宽的最小值,P为这n件设备的总价原创 2016-10-20 21:47:31 · 277 阅读 · 0 评论 -
poj之旅——1635
不见得是dp。题目简述:就是给你一个字符串,0表示向下走一层,1表示往回走一层,走到一个地方就添加一个结点,现在问你这两个字符串构成的树是不是一样的。如样例:A:0010011101001011B:0100011011001011画出对应的树:A:B:可以看出两者本质是相同的分析:我们将根节点的子树排布的顺序进行按照从小到大排,然后对应得到的原创 2016-11-10 19:00:37 · 266 阅读 · 0 评论 -
poj之旅——1015
描述在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团。选m人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0到20。为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分和控方总分的差的绝对值最小。如果有多种选择方案的辩方总分和控方总分的之差的绝对原创 2016-11-10 18:07:54 · 559 阅读 · 0 评论 -
poj之旅——1083,1088,1125,1157,1163
一些比较简单的dp题,光看图就能猜到意思。1125:#include#include#includeusing namespace std;int n;int f[110][110];int main(){ while (scanf("%d",&n)==1 && n){ memset(f,0x3f,sizeof(f)); for (int i=1;i<=n;i++){原创 2016-11-10 17:58:22 · 275 阅读 · 0 评论 -
poj之旅——3264
//2886又没理解,诶诶,语言障碍题目描述:给出n个人的升高,有T个询问【i,j】,求从i到j最高-最矮的差。题解:典型的rmq问题,hankcs用的平方分割(术语称:块状数组),不喜欢,自己打的Square—Table算法,和线段树练练手。参考程序:ST:#include#include#define maxn 51000using namespace原创 2016-06-19 19:38:52 · 185 阅读 · 0 评论 -
poj之旅——2155
//仍然没看懂3109,欸。。题目描述:给出T组数据,每组数据包括n(一个n*n的初始值为0的矩形)与Questions(表示问题的数目),每个问题可以有两个操作:C x1,y1,x2,y2:将[x1,y1]到[x2,y2]的子矩阵中的元素进行not操作。Q x,y:输出[x,y]的值。题解:题目要求二维——poj真难为人,一维还没弄清楚,就直接上二维。。而且在这个原创 2016-06-18 20:05:47 · 313 阅读 · 0 评论 -
poj之旅——2886
题目描述:有n个人,给出每个人的名字和手中所持有的数字,从第k个人开始淘汰,每到淘汰一个人时,下一个要淘汰的人就是顺时针数其手数字个人,每个人淘汰时有一个分数,这个分数就是这个人被淘汰的次序所具有的全部因数个数。题解:很明显有一定的约瑟夫问题,网上有许多人用反素数+线段树,不得不说线段树确实很厉害,但是编程复杂度也不是吹的。 具体思路可见: 但是有负数,唯一原创 2016-07-05 12:30:44 · 348 阅读 · 0 评论 -
poj之旅——1990
题目描述:给出n个人,每个人都在x轴上的x[i]处,各用v[i]的音量与别人说话,两个人之间互相说话的产生音量为distance*max{v[i],v[j]},为问每个人两两之间说话,总音量是多少。题解:第一看到这题目傻眼了,觉得不就是显摆摆的模拟,不用模拟没办法做,后来才知道用树状数组。 首先按音量排序,这样我们就可以保证当前计算的人的音量是最大的。当然,a和b说话,原创 2016-06-17 12:54:28 · 266 阅读 · 0 评论 -
poj之旅——2549
题目描述:给出n个数,求a+b+c=d的最大的d,四个数均不同。题解:此题出的不算好,本意应是用折半枚举,可是限定了不同,则必须把三个数a,b,c枚举出来,否则会比较麻烦,所以直接裸裸的O(n^3)竟然过了,不可思议。可怜的set与vector/array要么TLE,要么MLE。欸。参考程序:#include#include#include#define maxn原创 2016-06-16 12:47:17 · 299 阅读 · 0 评论 -
poj之旅——3109
树状数组,要先离散化,按照y轴扫描,若当前点是此列最高的点,则在接下来的点中不断向树状数组中加1,直到最后一个点时加-1。 具体地解释一下原理: 1.离散化——这个大家应该都会,sort后用unique或自己手动。 2.双关键字排序,以列为一号关键字,这时从第一个开始扫描,有三种情况: 一.当前点是此行的第一个点,则在此行此列以后的bit中+1 二.当前点是此行的最后一个点,则在此行此列以后的bit中-1//前两步具体可原创 2016-06-18 21:13:41 · 363 阅读 · 0 评论 -
poj之旅——3368
//好一段时间没弄了,期末考试去了,手都生了。题目描述:给出n个非递减序列数,有Q个询问,l,r表示从l到r的出现次数最多的数的出现次数。题解:可以为了省空间而浪费编程复杂度——我不喜欢。介绍一个很简单的方法:建立一个线段树,维护三个数据maxlen以mid向两边能得到的最大长度,left以l向右能得到的最大长度,right以r向左能得到的最大长度。用3原创 2016-07-02 13:59:45 · 242 阅读 · 0 评论 -
poj之旅——3977
题目描述:给出n个数,求一个非空子集绝对值尽量小。题解:非常明显的折半枚举。必须用map做,我原来用数组和vector,结果TLE了。。。 逼着我用奇怪的迭代器。参考程序:#include#include#include#include#include#define maxn 500using namespace std;typedef long原创 2016-06-15 13:48:15 · 260 阅读 · 0 评论 -
poj之旅——2674
题目描述:在长度为L的杆上,有n只蚂蚁,他们有的向右爬,有的向左爬,速度均为v,求最后一只掉下杆子的蚂蚁的时间与名称。题解:时间显而易见,maxdistance/v即可。 名称有点麻烦,需要先保存距离为maxdistance的蚂蚁编号,再沿着它的方向,看有几只蚂蚁和他方向相反,编号对应加减一下即可。参考程序:#include#include#incl原创 2016-06-14 14:07:40 · 367 阅读 · 0 评论 -
poj之旅——2376
题目描述及题解:给定N个小区间以及区间起点终点,求能用它们覆盖区间[1,T]的最小组合。贪心策略是从左往右,尽量选择长度最大的区间。首先对所有奶牛排序,按照开始时间排序。然后更新起点=终点+1,搜索剩下的奶牛中能够覆盖这个起点同时终点最远的那一头,更新终点。参考程序#include#include#include#include#in原创 2016-05-09 14:06:49 · 212 阅读 · 0 评论 -
poj之旅——3050
题目描述:在5 * 5的方格里跳房子,起点是任意位置。将跳过的数连起来组成一个5位数(前导零可能),问一共能组成多少个数字?思路:当前的状态可以定义为当前位置、当前数字长度、当前数字这三个要素,利用状态转移dfs即可遍历所有情况。对于数字的储存使用single key set(说白了就是桶,不过方便一些)可以轻松满足要求。参考程序:#include#include#incl原创 2016-05-09 12:29:21 · 228 阅读 · 0 评论 -
poj之旅——3187
题目描述:将一行数按杨辉三角的规则计算为一个数,已知最后那个数和三角形的高度,求最初的那行数思路:用杨辉三角的组合公式:杨辉三角前10行: 1原创 2016-05-09 12:17:30 · 233 阅读 · 0 评论 -
poj之旅——3614
题目描述:有C头奶牛日光浴,每头奶牛分别需要minSPF_i和maxSPF_i单位强度之间的阳光。现有L种防晒霜,分别能使阳光强度稳定为SPF_i,其瓶数为cover_i。求最多满足多少头奶牛题解:首先得确定一个贪心策略,在满足minSPF的条件下,尽量把SPF小的防晒霜用在maxSPF小的奶牛身上,因为maxSPF大的奶牛有更大的选择空间。用一个最小堆q维护maxSPF的最小值,可以原创 2016-05-27 12:31:10 · 378 阅读 · 0 评论 -
poj之旅——3040
题目描述:农夫约翰要给奶牛Bessie发工资了,每周至少 C 元。约翰手头上有面值V_i的硬币B_i个,求最多能发几周?题解:贪心策略是使多发的面额最小(最优解)。分三个阶段:首先面额不小于C的硬币属于没办法节约的类型,先统统发掉。然后对硬币面额从大到小尽量凑得接近C,允许等于或不足C,但是不能超出C。接着按硬币面额从小到大凑原创 2016-05-13 13:16:38 · 195 阅读 · 0 评论 -
poj之旅——1017
题目描述:有 1 * 1 到 6 * 6 的产品,最少用几个 6 * 6 的箱子装它们。题解:贪心策略是先装大的,再装小的,6 * 6 和 5 * 5 以及 4 * 4 肯定独享一个箱子(不可能再放得下同规格的产品)。装了 4 * 4 和 3 * 3 的箱子还可以放 2 * 2 的产品,给几张图,可以看得更清晰:参考程序:#include#include#include#原创 2016-05-12 12:40:11 · 277 阅读 · 0 评论