- 博客(27)
- 收藏
- 关注
原创 Codeforces Round #451 (Div. 2)题解
比赛时间2017 12 16 19:35-21:35。结果+133rating。
2017-12-17 13:19:39 328
原创 dp-飞扬的小鸟
noip2013day1T3飞扬的小鸟(评测平台:洛谷p1941) 题目不讲了,大家都知道。 很显然的一个bfs,实则不然(实则我不会),那么就dp吧,但是怎么优化呢…… 心路过程: 暴力 没错,最朴素的暴力背包! 对于ans[i][j],下降由ans[i-1][j+y[i-1]]转移而来(如果ans[i-1][j+y[i-1]可到达); 上升则要玄学操作(详见代码),高度达到m后无法
2017-10-20 21:00:08 293
原创 倍增
(本文中出现的^为乘方,不是异或。)倍增,说实话是一种思想,就和分治、贪心一样,利用二进制的一些特性完成程序。RMQ洛谷p1816忠诚这题是典型的RMQ,即离线状态下求区间最值(在线就只能线段树啦)。核心是设置ans数组,ans[i][j]表示从第i个数字起2^j个数字的最小值。那么,ans[i][j]可由ans[i][j-1]和ans[i+(1而对于区间[x,y],设
2017-10-01 11:50:23 220
原创 并查集
所谓并查集,就是对许多集合做多次合并与查找。其关键就是递归寻找father与进行路径压缩,基于并查集的很多题目都会在压缩上做文章。洛谷p3367并查集模版题#includeusing namespace std;int n,m,p,fa[10010];inline int getfather(int x)//寻找father并进行路径压缩{ if(fa[x]==x)re
2017-09-27 18:45:48 180
原创 图论-最小生成树
Prim算法洛谷p3366最小生成树模版题Prim算法基于点,在无向图中每次选择离已生成的树最近的一个未加入点加入树,随后更新未加入的点的距离。#includeusing namespace std;const int MAXN=5010,MAXM=400010;struct line{ int y,next,w;}l[MAXM];int f[MAXN]={0},n
2017-09-27 14:04:25 249
原创 图论-不会tarjan的悲伤
洛谷p2746校园网题解全是tarjan,很绝望,但是对于这张图,由于数据范围很小,所以可以先用floyed缩点,如果缩点后只有一个点,则答案为1,0;否则对于第一题,如果有一点的入度为0,则它肯定要一份软件,如果不为0,则一定可以从别的点获得软件,而对于下一个问题,对每个出度为0的点,需拓展一条出边; 对每个入度为0的点,需拓展一条入边,则可以完成条件。所以可以从出度为0
2017-09-15 18:50:09 362
原创 图论-存储&最短路
今天讲图论......基础就开心地跳过图的存储邻接矩阵没什么,注意一下初始化就好了,主要是邻接表。曾经pascal用的指针,现在用的是静态链表,感觉很six。const int MAXN=10010,MAXM=10010; struct line{ int y,next;//如果有权值还要再开一个变量}l[MAXM];int n,m,f[MAXN]={0},num=0
2017-09-12 07:45:08 336 3
原创 贪心
很久没写博客了很惭愧贪心在《算法导论》上竟然排在动态规划后面贪心的基本思想:先把问题分成若干步骤,再在完成一个问题的每一步中,都选择局部最优解,最后导致全局最优解。听起来很简单,但是贪心需要严格的证明。洛谷p1094纪念品分组由于一组最多两个物品,所以考虑尽量更多利用空间。对于已排好序的a[1],a[2].....a[n-1],a[n],对于a[1],将它与可以安排的最
2017-09-03 19:16:06 189
原创 堆
c++真的好方便啊~合并果子#include#include using namespace std;int n,a[10010]={0},sum=0;priority_queue,greater > q;inline int read(int &num){ num=0; char c=getchar(); for(;isdigit(c)==
2017-08-21 21:12:31 182
原创 dp day4-博弈论
先贴一个链接http://blog.csdn.net/qq1169091731/article/details/51942752度娘和csdn都是好东西洛谷p1857取石子博弈论的题目,对于一种情况,如果有前驱情况为必败态,则该情况必为必胜态,若前驱情况都为必胜态,则该情况为必败态。且若当前情况为必胜态,则应从步数最少的前驱必败态转换而来(尽快胜利),若当前情况
2017-08-20 16:35:27 190
原创 dp day3/4-二维dp
二维dp洛谷p2701巨大的牛棚和p1387一模一样,只不过数据更大,先用一个二维前缀和做了一遍,发现也能AC,最久一个点44ms#includeusing namespace std;int a[1010][1010]={0},s[1010][1010],n,t;inline void init(){ scanf("%d%d",&n,&t); for(int
2017-08-20 09:38:11 194
原创 dp day2/3-区间dp
区间dp洛谷p1880石子合并环形的区间dp,具体看代码吧......#includeusing namespace std;int n,a[210]={0},s[210][210]={0},ma=0,mi=1000000,sum[210]={0};int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf
2017-08-18 19:51:31 214
原创 dp day2-背包
混合背包分别处理就好啦二维费用的背包问题要多一维数组,其余和前三种基本一样洛谷p1509找GF(tan90)除了二维以外还有一个最大数量时求最小花费的限制,先是用结构体写了一个最简陋的版本(然后发现题解也没有更优化的版本......)把妹子看成有两种花费(money rp)的物品(这样会被打的吧),然后dp#includeusing namespace std;st
2017-08-18 08:49:51 224
原创 dp day1-背包
01背包洛谷p1048采药01背包对于每一个物品,在当前的s可装下当前物品时比较装下该物品的总价值和不装该物品的价值。(经典题+1)pascal也做过,省空间的做法如下#includeusing namespace std;int m,t,s[1010]={0},ma=0;struct plant{ int time,value;};plant p[110];int
2017-08-17 14:14:23 214 1
原创 dp day1
洛谷p1020导弹拦截pascal也做过的经典问题,最长不上升子序列+贪心#includeusing namespace std;int a[110]={0},b[110]={0},s[110]={0},n=1,sum=0,ans=1;//s[i]表示击落i导弹可达到的最大值void dp(){ for(int i=n;i>=1;i--)//倒着搜,当前在第i个导弹且该击落该
2017-08-17 13:36:23 198
原创 一次小测试(+摸鱼)
摸鱼1 洛谷p1540机器翻译简单队列模拟,数据小到不用循环队列的那种。代码不贴了,洛谷都有保存。摸鱼2 洛谷p1068分数划定读题是重点。ps:浪费别人的时间等于谋财害命!测试主要是字符串1递推2模拟,水题3、模拟,重点:读入char时会把回车也读入4、结构体+sort,水题
2017-08-15 20:04:52 266
原创 分治/二分/递推
洛谷p1057传球游戏(看到什么都像dp的毛病得改)#includeusing namespace std;int a[40][40]={0},n,m,l,r;int main(){ scanf("%d%d",&n,&m); a[0][1]=1; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { l=j-1>0?j-1:n;
2017-08-13 19:54:05 240
原创 二分+分治plus
洛谷p2678跳石头终于过了,复杂度(nlogn)看来还是可以接受的。判断是否成立部分也不难。顺便过了p1316丢瓶盖,两题挺像的。#includeusing namespace std;int a[50010]={0};int len,n,m,l,r,mid; bool check(int temp)//判断是否成立{ int s=0,flag=0; for
2017-08-12 18:37:30 160
原创 分治
今天学分治-初步,还需要努力啊洛谷p1226 快速幂经典模版,Pascal时也打过,不多说。#includeusing namespace std;long long b,p,k,t,s;int main(){ scanf("%lld%lld%lld",&b,&p,&k); printf("%lld^%lld mod %lld=",b,p,k); t=b%k;s=1;
2017-08-11 21:11:28 217 1
原创 洛谷p2239 螺旋矩阵
数据范围这么大,模拟绝对tle。于是考虑数学方法。先一圈圈搜索,找到所求坐标所在的那一圈,再判断。对于1 2 3 412 13 14 511 16 15 610 9 8 7第一圈的数有1~12,他们的特点是横坐标在第一或倒数第一行,或纵坐标在第一或倒数第一列。第二圈同理。#includeusin
2017-08-10 20:25:15 664
原创 洛谷 入门综合练习2
p1426 小鱼会有危险吗没有判断最开始时的情况......#includeusing namespace std;int main(){ double sum=0,t=7,s,x,begin,end;int b=0; scanf("%lf%lf",&s,&x); begin=s-x;end=s+x; while(b==0&&sum<=end) { if(sum>=be
2017-08-10 19:39:27 259
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人