自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 Codeforces729C Road to Cinema(贪心+二分)

题目大意:在tmin内到达电影院,路程从0至s,途中存在加油站,加油不需要时间,给定一批车辆,求出可以准时到达电影院的车中租金最少的那一个。主要思路:因为加油站以无序的顺序给出,所以要将加油站位置进行排序,得出各加油站之间的距离。所使用的车辆应具备以下两个特点:车能够完成任务,这需要该车油箱的容量可以跑完任意一个加油站之间的路程,并且能在tmin之内跑完全程。由于加油不需要费用和时间,从贪心的角度

2017-02-27 22:04:31 643

原创 Codevs1066 引水入城

前言:又是做到吐血的一道题。膜题解以后才明白这题怎么做。思路:我觉得第一问是很好求的,直接从上往下BFS就够了。第二问被卡住了,但有一点突破口就是,需要确定第一行的某一个格子究竟能控制多少最后一行的格子。通过样例解释,可以观察到这样一点。似乎对于某一个第一排格子,其可以控制连续一段最后一行的格子,且对于有左右相对顺序的两个第一行的格子,其控制的一排格子也有同样的相对顺序。实际上这个猜想是正确的,

2015-11-01 18:49:08 884

原创 Vijos1096 联合权值

前言:第一次参加NOIP时遇到的题。当时傻傻地用Floyd跑结果TLE,幸亏矩阵还没开爆。回想起来也是相当惊心动魄的……思路:如果要一个个的找儿子再找孙子(因为这是一棵树,所以是可行的),O(n2)O(n^2),TLE。所以可以换一种思路,可以枚举中间点,这样也能得到同样的效果。但是单纯的枚举一个点后再找所有儿子,仍然是O(n2)O(n^2),仍TLE。其实仔细观察就可以发现,记sum[i]代表点

2015-10-31 08:14:59 649

原创 Codevs1170 双栈排序

思路:看题解看得目瞪口呆,真的不想说什么了。代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<stack>#include<algorithm>#include<vector>using namespace std;const int maxn=1005;int n,col[maxn];int a[

2015-10-29 15:05:08 644

原创 Codevs1198 国王游戏

思路:贪心。由题意可知,交换相邻两个人对于其他人并无影响。设这两个人按顺序分别为{a1,b1},{a2,b2},交换前是max{sum*1/b1,sum*a1/b2},交换后是max{sum*1/b2,sum*a2/b1},而分母为1的项一定不会被最大值考虑到,则需要考虑max{sum*a2/b1,sum*a1/b2},即max{a2/b1,a1/b2}。如果不交换更优,则有a1/b2<a2/b1a

2015-10-28 17:22:25 826

原创 Codevs1183 泥泞的道路

题目大意:给定一张图,每条边上都有一个长度和时间,求从1到n经过的路径中∑length/∑time的最大值。思路:二分答案+SPFA。假如有一解∑length/∑time≥ans∑length/∑time\ge ans更优,其中ans为已经得到的一个解,则有∑length−ans∗∑time≥0∑length-ans*∑time\ge 0,即∑(lengthi−ans∗timei)≥0∑(leng

2015-10-26 19:49:26 784

原创 Vijos1118 统计单词个数

题目大意:给定一个长度20*p的字符串以及一个字典,求将该字符串分成k份后最多能包含多少个字典中的单词(某个字母不能同时作为多个单词的开头)。思路:划分型DP。先预处理出在各个区间中包含的单词数,这里可以只记录最短单词的长度,因为一个字母只能提供一个开头。接下来就有f[i][k]=max(f[i][k],f[j][k-1]+cnt[j+1][i]),其中f[i][k]表示将前i个字符插入k个隔板(

2015-10-25 21:31:03 536

原创 Codevs3286 火柴排队

题目大意:给定两个长度为n的序列,序列中相邻的数可以相互交换。求至少交换多少次才能使火柴之间的距离和最小。思路:可以用排序不等式证明,当每一根火柴与在各自排完序的序列中的序号相同者配对时,才有最小距离和。对于一个序列a,先确定其中元素相对于整个序列的位置,再用编号1、2、3进行定位,再对序列b中元素按已经在a中标好的标号与排名的对应关系对b进行标号,最后就是求逆序对个数了。代码如下:#incl

2015-10-25 20:51:47 596

原创 Vijos1347 乘积最大

题目大意:给定数n、k,求在数n中插入k个乘号所能取得的最大值。思路:记f[i][k]表示前i个字符插入k个乘号能取得的最大值,则有f[i][k]=max{f[j][k-1]*num[j][i]},num[j][i]表示从j到i的字符组成的数的值,初始化f[i][0]=num[1][i],目标f[n][k]。代码如下:#include<iostream>#include<cstdio>#i

2015-10-21 14:37:57 613

原创 Vijos1845 花匠

题目大意:给定一列整数,求满足题中所给的条件的最长子序列的长度。思路:列举上几个i的值就可以发现,实际上题目要我们求一个最长摆动数列,并且数列中的每个数要么比它的左右两个数都小,要么就都大。这样我们只需遍历一遍数列求出波峰与波谷的个数最后加上两端的就行了。代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<cm

2015-10-21 08:06:42 592

原创 Codevs1700 施工路线第二季

前言:这题写得相当费劲,其实还是思路不好。本来想两次dfs找最远点求得树的直径,但不幸多处TLE。后来发现可以用树形DP做,写出来以后还是T,以为是vector的push_back惹的祸,就学了邻接表(邻接表学习处),仍T。最后发现是并查集忘记了路径压缩,于是改后就A了。题目大意:求最小生成树的边权和及树的中心到最远点的距离。思路:kruskal+树形DP。在以任意一点为根建树以后,就可以开始D

2015-10-20 16:11:29 571

原创 Codevs1172 Hankson的趣味题

快被这题逼到吐血了,本来想通过质因数分解确定范围最后乘法原理,最后在RE的驱使下发现根本不能这么玩因为这数太大了!最后去%题解,发现了一个实在简单的方法。原文:根据题意可以推出 lcm(x,b0)=x∗b0/gcd(x,b0)=b1lcm(x,b0)=x*b0/gcd(x,b0)=b1 =>b1∗gcd(x,b0)=x∗b0=>b1*gcd(x,b0)=x*b0 =>gcd(x,b0)=x∗

2015-10-19 21:24:44 833

原创 Codevs2822 爱在心中

题目大意:求一张有向图中的点数大于1的强连通分量个数,并从小到大按顺序输出输出可能存在的与其它强连通分量都相同的强连通分量的组成端点。思路:对第一问直接tarjan即可。对第二问我用的dfs,但实际上如果存在,这是缩点后内向树(就是儿子节点指向根节点的有向树)的根节点,再判断出度为0的点是否唯一即可。代码如下:#include<iostream>#include<cstdio>#inclu

2015-10-18 20:08:22 682

原创 Catalan数(高精版)

权当打模板了。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct bignum{ int len,a[1005]; bignum() { len=1; memset(a,0

2015-10-18 20:00:53 626

原创 POJ2449 Remmarguts' Date

题目大意:给定一张有向图,求某两点间的第k短路。思路:先用堆优dij处理出各点到终点的最短路距离,然后进行A*,当终点取出次数为k时,第k短路即已求出。非常要注意的一点是,如果s=t,那么k++。(因为这个不知道被坑了多少回…)代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<vector>#includ

2015-10-17 15:23:21 563

原创 Codevs1653 种树2

题目大意:有一排直线的种树区域,每个块最多只能种一棵树,有一些要求从第i块到第j块至少种多少树的要求,求至少种多少树能满足这些要求。思路:可以用贪心,也可以用差分约束。对于差分约束来讲,如果让求最小值,则应将所有不等式化成a-b>=i的形式,然后从b向a连一条边权为i的边,跑最长路,若存在正环则无解,dist数组赋值为−∞-∞,反之亦然。如果存在与0的约束条件,可以建一个源点,其dist值固定为0

2015-10-17 08:21:09 688

原创 Vijos1754 最优贸易

题目大意:给定一张有向图,求从起点到终点最大值与最小值的差值(这么说还不准确,下文有解释)的最大值。思路:可以tarjan+DP,不过SPFA是可以解决的。由于只能先买入再卖出,因此要先正向spfa求出到某一点时可能的最小值,再反向spfa求出到某一点时可能的最大值,同时记录点的访问情况,这样两次都被访问过的点就在起点到终点的路径上。最后扫描这些点即可。代码如下:#include<iostre

2015-10-16 08:10:17 820

原创 Codevs3269 混合背包

题目大意:我觉得不用说了,题目已经很明显了。鉴于01背包和完全背包已经写过了,这次只说多重背包了。利用2进制思想分解,01背包又考虑了某件物品选与不选的情况,这样就成功将问题转化了。代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,v

2015-10-15 19:43:58 545

原创 Codevs3324 新斯诺克

题目大意:给定一个具有n个数的数列和一个数m,求有多少个连续子序列的和的平均数大于m。思路:平均数是不用管的,数列中每个数直接减去即可,这样条件转化为连续子序列的和大于0。再由此联想到数组的前缀和,则某一段序列和a[i]+…+a[j]=s[j]-s[i-1],符合条件的话,则有s[j]-s[i-1]>0,即s[j]>s[i-1],由此转化为求逆序对数。代码如下:#include<iostrea

2015-10-15 18:51:00 767

原创 Codevs2880 送外卖

题目大意:给定一张图,有0至n(n<=15)这些点,两两之间均有通路,求从0开始经过所有点(可以重复)再回到0的最小花费。思路:n挺小,但dfs还是会超时,正解是floyd+状压DP。首先需要面对的一个问题是如何表示访问过哪些点,没访问过哪些点,这可以用二进制的思想解决。即利用某个数的二进制表示中某一位的0或1来表示该点是否存在于集合中,例如,一共n+1个点,如果都在集合中,则可以表示为1<<(

2015-10-15 15:41:10 584

原创 Codevs1648 最大和

直接看这个就行了,没法再详细了……最大连续子序列和的6种思考方法再说一句,其实环是不用管的,因为假如一个环是从1到i,再从j到n,要使加和最大,只需令i+1到j-1最小。代码如下:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int n;long long s=0,maxsum=0,

2015-10-15 09:30:44 433

原创 Codevs1161 抢掠计划

前言:这题A得挺值,不仅学会了tarjan以及递归转非递归,还熟悉了spfa,不错。鸣谢:hzwer、t14t41t。题目大意:给定一张有向有环图,有点权,求一条路上得到点权的最大值。思路:一个强连通分量里的点权是全部能取得的,因此用tarjan进行缩点。最后求值时,可以用spfa求最长路,个人感觉也可以用拓扑序递推,我用的是spfa,具体的在程序中解释。代码如下:#include<ios

2015-10-13 21:42:28 679

原创 BestCoder Round #59 (div.2)

前言: 受水平限制,仅能在比赛及其结束后写出前三题。题目:SDOI思路:就是纯模拟,只不过略为恶心。代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=105;struct node{ string

2015-10-13 07:34:17 366

原创 UVa481 What Goes Up

题目大意:求LIS,同时输出该序列。思路:发现了一个叫lower_bound( )的函数,直接用它二分即可。不过要输出序列,需要记录各元素在二分中的序列中的位置(即以该元素为尾的LIS长度)。然后从后往前找一遍,第一个出现的代表某长度的元素即为序列中的元素(因为该元素最晚被更新),输出即可。代码如下:#include<iostream>#include<cstdio>#include<cs

2015-10-12 15:57:16 489

原创 Codevs1166 矩阵取数游戏

首先吐槽:先是高精加忘了进位时要用+=,WA了几发;后来是高精乘单精写不对,被迫写高精乘高精,这样一来又WA了几发;高精写好后,发现居然T了,于是改成多压几位(多压几位也是可以节省时间的),然而还是T,并没有什么L用;于是再次发现,我居然用了O(n∗m3n*m^3)的算法,被迫改为O(n∗m2n*m^2);于是乎,不T了,WA了三个点;最后发现,改算法时我把区间长度当成了n而不是m(就这还能过7个点

2015-09-26 10:44:37 786

原创 Vijos1313 金明的预算方案

题目大意:给定物品数与总钱数,物品分为主件与附件,想选附件必须选主件,求最大能得到多少给定价值。思路:绝对是有依赖的背包问题,可将其转化为01背包问题。对于每一个物品集合,取不选、只选主件、多选一个附件、多选两个附件的最大值即可。要注意的一点是,要预处理将属于同一个集合的物品(即主件及其附件)归到一起。代码如下:#include<iostream>#include<cstdio>#incl

2015-09-22 21:50:19 844

原创 POJ2823 Sliding Window

题目大意:给定n个数,有一个长度为k的窗口从左滑至右,依次输出窗口内的最大值与最小值。思路:显然,这是单调队列的模板题。这里说一下单调队列:这是一种具有单调性的队列,以求最大值为例,将出现的数据按时间(即从左向右)放入队列中。当一个元素被从尾部放入队列中时,考察已在队列中的末尾元素,如果比要插入的元素值小,则一直删至一个比它大的元素值或队列为空为止。这样队列内部就是单调递减的。这样做的合理性在于,

2015-09-12 15:03:51 459

原创 Codevs1380 没有上司的舞会

题目大意: Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。要你求出舞会可以组织出的最大快乐指数。思路:显然,这是一个树形DP。因为一个根节点选不选会产生不同的情况,所以要开一个二维数组进行记录。记f[i][0]表示

2015-09-01 19:47:31 485

原创 高精度之重载运算符

这篇文章就纯属自娱自乐啦,受时间以及技术原因的限制,这里面的重载,减法支持的功能仅限于减一次(因为没有同是负号的判断),除法仅限于高精除单精(高精除高精的一个个的减或者二分实在是不想写了)……结构体片段以及输出操作如下:struct bignum{ int len,s[maxn]; char flag; bignum() { le

2015-08-25 11:34:22 1237

原创 Codevs1169 传纸条

首先,必须吐槽的是,这题,经过了各种对拍加上截标准程序片段与本人程序互换以后,仍然WA,最后搞得我把整个四维的f数组都输出了,结果发现,在某一组小数据中,我的f数组总与标准程序的f数组差2。于是乎,我便去找输入了,于是乎,i从1循环到m打成了n……还我的两个半小时!(怨念发作中……)好了,言归正传,题目大意是,从(1,1)走到(m,n)再走回去,途中不经过重复的点累加路径权值的最大值。思路:显然

2015-08-24 11:21:31 879

原创 数字三角形合集

简介数字三角形这东西,出现了有一定的年头了。于是,出现了一些变种……目前已知的题目Codevs1220 数字三角形这题是原版IOI1994啊……f[i][j]=a[i][j]+max(f[i-1][j],f[i-1][j-1])。Codevs2193 数字三角形ww 和 Codevs2198 数字三角形www改了,必须得经过一个点。并且2198是2193的数据规模上的加强版。然而这并没有

2015-08-24 08:14:31 1096

原创 Codevs3027 线段覆盖2

题目大意:数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。思路:如果不是线段而是点,显然这题很容易就能解决。于是我们把每个线段都看成一个点,则记选至第i个线段时的最大价值为f[i],j为不与i相覆盖的且在i之前的线段(当然,如果要从左往右推的话,这里要事先让线段按右端

2015-08-23 11:27:49 1740

原创 Codevs3332 数列

题目大意:a[1]=a[2]=a[3]=1,且a[x]=a[x-3]+a[x-1] (x>3),求a数列的第n项对1000000007(10^9+7)取余的值。思路:显然,直接乘与开数组是无法通过该题的。于是,我们想到了矩阵乘法与快速幂。开一个数组a[4]={0,1,1,1},转移矩阵为{{0,0,1},{1,0,0},{0,1,1}},经过n-3次幂后再与a相乘,这样a[3]就是所求的答案。在

2015-08-22 14:48:13 1080

原创 Codevs3008 加工生产调度

题目大意:某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。求怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指,从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。思路:显然,如果产品开始生产,那么A生产线是肯定不会停止运转的,反而是B生产线有可能要等待A生产线,这样我们就需要B的运转时间最小。

2015-08-21 15:12:33 2436

原创 Codevs1225 八数码难题

题目大意:在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。思路:使用IDA*算法。估价函数为现在棋盘与目标棋盘的对应元素不同的个数。剪枝:若当前深度加上

2015-08-20 17:13:36 813

原创 POJ3264 Balanced Lineup

题目大意:Framer John有一段木板,想用以建筑围墙,没有锯子的他只好向Framer Don求助。FD提出要求,FJ每截开一段木板,就要给这段木板长度的钱。FJ想使花费最少,向你求助。思路:绝对是合并果子的翻版!把截木板当成合并木板就行了。小心L、n的范围,最终的ans用int装是装不下的,要用long long。代码如下:#include<iostream>#include<cstd

2015-08-19 11:11:00 753

原创 Codevs1052 地鼠游戏

题目大意:从计时开始有n个地鼠出现,每个地鼠都有其停留时间及分值,问最多能获得多少分值。思路:1.将地鼠按出现时间先后排序。2.按出现时间从先到后遍历,将出现过的地鼠的分值加入到一个最小堆中,每次查看当前地鼠的t[i]和当前时刻ti是否满足ti<=t[i]。若ti<=t[i],则将当前地鼠分值加入最小堆,ti++,即进入下一若ti>t[i],由于ti每次+1,所以一定有ti=t[i]+1,那么此

2015-08-19 10:57:25 969

原创 POJ3903 Stock Exchange

题目大意:求最长上升子序列……思路:看这数据规模,L<=100000,还一个点多组测试数据,O(n2n^2)的是不用指望了,于是要使用O(nlogn)的算法。说一下该算法:令序列存于数组a中在O(n2n^2)的算法中,我们对于一个f[i]值的确定,需要扫描j=1->i-1的所有a[j]值,并取a[j]<<a[i]时的f[j]的最大值。试想如果存在两个个值x与y,满足x<<y<<i,x<<y,且f

2015-08-15 08:51:42 777

原创 POJ1703 Find them,Catch them

题目大意:已知有两个团伙,给定一些信息。信息中表示两人不处于同一团伙。同时有一些询问,问两人是否在同一团伙中。思路:显然这道题需要使用并查集。但是,似乎并查集并没有让两个元素不处于同一集合中的功能。于是对于给出的x和y,我们可以让x与y+n处于同一集合,让y与x+n处于同一集合,这样便能很好地解决这个问题。判断条件:查询时,若getfa(x)=getfa(y),那么它们就在同一帮派;若getfa

2015-08-13 17:56:41 727

原创 Vijos1909 寻找道路

思路:这题嘛,边权都为1了还让求最短路,没别的,肯定bfs。对于哪些点能走,哪些点不能走,只需从终点对逆图进行bfs最后再对每个点一一检查就行了。但需要注意的一点是,图中存在环,在bfs时要打上访问标记(否则就是TLE+MLE,惨痛的教训……)。代码如下:#include<iostream>#include<cstdio>#include<queue>#include<vector>#i

2015-08-13 16:21:44 827

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除