自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mico3165嵌入式开发板IAR环境搭建以及Demo运行

最近跟着老师做毕设,题目是有关于 嵌入式开发的系统安全测试,首先得搭一个集成的开发环境,研究了几天,终于基本把大致的东西弄好了,这里写下来以供经验所需。 开发所用的板子是mico3165,搭载了mico系统,调试器用的是JLink。 其实搭建的过程大部分在官网上都是有教程的(micohomepage),只不过遇到了几个问题,通过在社区提问得到了别人的答复,然后顺利解决。下面我把我遇到的接问题记下

2016-01-12 16:15:30 2025

原创 poj3368

RMQ求区间最大值。 要求某一段区间内出现的最多的数字的次数。那么我们用一个f[i]来记录某个位置上出现的连续数字个数。然后用RMQ处理,在处理左边界的时候,我们要注意排除一段连续的相同数字,因为我们记录f[i]的时候就是做的前缀和,排除后做新区间的RMQ,然后再与排除的那一段区间大小进行比较。#include<stdio.h>#include<iostream>#include<string

2015-11-11 17:50:24 413

原创 poj3264

区间求最大最小值问题,可以用RMQ算法。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#inc

2015-11-11 13:53:23 302

原创 poj2886

线段树+反素数。这题是类似于约瑟夫环的问题。 首先我们得了解反素数,我们有n 个人,那么就至少有n个回合,要求第几个出局的人获得的糖果最多(获得的糖果数等于第i轮出局的人,i所含的因子的个数),而反素数的定义就是对于一个数字x,有任意一个i(0< i < x),都有g(x)>g(i) (g(x)代表x所含的因子的个数),所以对于1-n来说,含有因子的数目最多,又得是最多里面数字最小的,那么只有那个

2015-11-10 20:31:43 718

原创 poj2155

二维树状数组。记录一个矩阵中的某个位置被提到几次,有篇文章说的很好。imos 至于怎么高效改变一个区间的值,高效询问某个位置的值,那么用树状数组是最快的。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vec

2015-11-09 19:44:49 283

原创 poj1990

题目意思就是有m头牛,每头牛有两个值,v和x,两两之间有一个值,设v分别为v1,v2,x为x1,x2,则它们之间的值为abs(x1-x2)Max(v1,v2),求所有m(m-1)/2对牛之间值的总和。 暴力的话很好理解了,但是这里的m数据范围最大为20000,n^2的效率是不可取的。所以这里我们引入树状数组。这道题目我们得用两个两个树状数组,一个叫做num[x],可以计算小于坐标x的坐标有几个,另

2015-11-09 16:15:07 1162

原创 poj2549

枚举+二分。首先用两个for循环确定所有a+b的值,然后再用两个for循环确定所有d-c的值,然后枚举a+b的值,二分所有d-c的值,看是否有相等并且符合条件的值,更新保存最大的d值,最后输出。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<io

2015-11-08 10:58:17 303

原创 poj3977

题目意思很好懂。一共有n个数字,选择其中的几个数字组成一个集合,使得它们的和的绝对值最小,输出这个集合的规模以及最小的那个绝对值。 n最大35,假设用暴力,那就是1<<35,这个数实在是太大了,所以我们选择用 折半+二分查找。即首先我们选择其中的一半数据(称为mid),然后计算出其中所有数据的集合情况,一共有1 << mid种。接着我们遍历n-mid那一部分的数据,选择一个合适的数,来放入之前的集

2015-11-07 22:34:23 352

原创 poj 2674

题意是有一个一维的世界,长度为l,这个世界上有n个人,他们分别位于这条直线上的某个位置,一直以v m/s的速度朝着正或反方向前进,直到走出这个世界。他们每个人都有个名字,如果某两个人相遇,那么他们会调头走,问你最后一个走出这个世界的人的名字是什么。 这道题目和 一条杆上蚂蚁相遇掉头差不多,但这里要你输出名字,其实原理差不多。我们将两个相遇的人掉头这件事 等效为 两个人相遇后交换名字,然后还是直走。

2015-11-07 13:05:31 374

原创 CF #329

A:暴力枚举两个字母,然后判断符合条件的字符串,找到最大长度就行。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#includ

2015-11-05 17:49:36 309

原创 CF #328

A:每次在一列中遍历所有行即可,从上往下找找第一个能到顶端的”W”,从下往上照找第一个能到底端的“B”,最后比较较小的那个就行。但是注意题目有说“W”的先动,所以如果它们到达目的地的步数一样时,A获胜。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#includ

2015-11-03 11:31:17 439

原创 hdu 5536

当时在现场做的时候队友写了个超级麻烦的,知道肯定不这样做,但是当时是在想不出另外的做法,后来知道原来O(n^3)也能过。。ORZ正解是用字典树,先把所有数字的二进制表示存入字典树,然后枚举i和j,从字典树中删除i和j代表的数字,接着开始反向匹配,如果a[i]+a[j]代表数字的二进制的那一位是0,则我们就匹配字典树中相应地方是否有为1的,反之则反。这样一来我们就能匹配最大的结果。匹配结束后及时把i

2015-11-02 11:46:17 721 4

原创 poj 2100

给你一个数n,求k串连续的数字,使得它们的平方和等于n。输出先输出k,然后按连续数字长度从大到小输出符合条件的答案。 还是尺取法。不过这道题目刚开始做的时候我先把10^7之内的数字的平方先预处理了下,结果MLE了。。 后来就直接计算,按照尺取法走一遍,就好了~#include<stdio.h>#include<iostream>#include<string>#include<string

2015-10-27 12:12:25 402

原创 poj 2739

先用素数筛选法筛选出一定范围内的素数,然后用尺取法计算有几种符合条件的即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#i

2015-10-27 11:22:51 270

原创 poj 2566

给你一个n长的序列,然后有k个询问,每个询问一个t,问你在n长的序列中和最接近t的为多少,并且输出此区间的左右边界。 尺取法第一题。 尺取法,就是以O(n)的效率来解决一个序列的端点移动问题。 在这里,我们要求最近接t的和,那么首先,因为数据较大,所以我们先预处理出所有的前缀和,而且得按值排序,这样子才能准确的移动“尺子”的端点。而且排序完以后也不会对结果造成影响,因为这道题目是取绝对值,所以

2015-10-26 22:55:50 430

原创 poj 1759

一共有n只灯笼,已知最左边的一只离地高度为h1,后面的灯笼离地高度满足 Hi = (Hi-1 + Hi+1)/2 - 1, for all 1 < i < N ,求最后一只h[n]的离地高度的最小值B。 上面的式子可以化为Hi+1 = 2*Hi-1+2-Hi-2。我们二分第二只灯笼的离地高度,用上面的式子求出最后一只灯笼的高度,如果过程中又出现某只灯笼的高度小于0,那么说明二分出的高度太小了,否则

2015-10-26 20:14:40 373

原创 poj3662

艾玛,这道题目一个星期前卡了我好久,所以后来都没信心做这个专题了,今天重拾打了一遍,过了,竟然就过了,太TM开心了。 题意就是给你n个点,它们之间有p条边,起点是1,终点是n,让你用电话线从1连接到n,其中的k条线已经提供给你了,无限长,剩下的得自己铺,代价就是铺的所有电话线中最长的拿一根,求最短的代价。 转换为二分,二分那个最短的距离,然后用优先队列+最短路来计算从起点到终点的最短路,我们要注

2015-10-22 12:11:03 457

原创 cf #325 (div2)

这场第四题没看懂样例,,研究Note好久。。最后发现自己少看了一句话。(:зゝ∠) 不过还好,前三题都比较顺利通过了。 A:我们舍去前导零和后导零,然后遍历那个安排表,按照它的题意计算即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<io

2015-10-13 13:21:36 298

原创 poj 2010

这道题目之前好像差不多做过一次,所以比较有思路。我们先将所有的值按照score从小到大排序,然后用优先队列(按照financial大的在前)维护某个数前面和后面各前n/2个最小的数,sum1[i]代表i前面n/2个最小的finacial之和,sum2[i]代表i后面n/2个最小的financial之和。最后从后往前遍历一遍,找到一个sum1[i]+sum2[i]+a[i].financial<=f的

2015-10-12 15:46:10 335

原创 hdu 5501

很经典的dp题。。可惜自己dp能力太弱了。。(:зゝ∠) 首先我们看题目,这种一看就是像背包问题,只不过这里的值是会变化的。所以我们就想是否存在一种排序方法,使得背包的结果是最优的。 我们假设有两个题目xi,xi+1,如果不交换它们的顺序,那么我们损失的分数为 ci*bi+1 如果交换,那么损失的分数为ci+1*bi,我们比较下这两个损失的大小。假设 ci*bi+1<=ci+1*bi,那么我们就

2015-10-11 10:14:18 564

原创 数学专题1

A:相当于已知 f[i] = 2*(f[i-1]+f[i-2]),然后求f(n),n大到2^60,所以我们无法用递推,此时我们就用矩阵快速幂。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#i

2015-10-10 16:19:54 313

原创 poj3685

二分套二分。 我们首先二分第m大的数是多少,二分出来以后,我们去判断整个N*N的矩阵里面小于它的数有多少个。通过观察i*i + 100000 * i + j*j - 100000 * j + i * j 这个式子,我们可以发现,当j不变时,式子的值是随着i的变大而变大的,即随i单调递增。那么我们就枚举每一列,然后二分所有的行,看看在那一列中小于那个数的有多少,统计所有列的情况,加起来,判断小于的个

2015-10-09 12:23:09 409

原创 poj 3597

仍然是二分。 因为N很大,我们无法直接算出吧所有的difference,然后求得其中的中位数,但是我们可以二分那个中位数mid,然后看对于数组中的每个数,值大于a[i]+mid的总的个数是否大于所有difference总数的一半,当然,首先我们得将原数组排序,求个数的时候我们也是用的二分。#include<stdio.h>#include<iostream>#include<string>#

2015-10-08 11:54:09 270

原创 poj 3111

这道题目跟2976差不多,也是二分那个最大的值,然后化成计算式,排序以后得到一个数组,取最大的前k个,然后记录结果,继续二分即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include

2015-10-08 10:47:22 259

原创 CF #324 (Div. 2)

A:因为t只有2到10的范围,所以直接在最前面写上一个t,然后后面补齐0就可以了。当然,t=10的时候要注意一下。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>

2015-10-07 15:44:16 314

原创 poj2976

说说思路吧。 我们假设a[i]+a[i+1]+…a[k]/(b[i]+b[i+1]+…b[k])=ans,那么得 (a[i]+a[i+1]+..a[k])-(b[i]+b[i+1]…+b[k]) *ans=0,题目要求的就是最大的ans,使得式子成立,我们二分这个ans (0< ans<1.0),针对每一个ans,我们计算出每一项a[i]-b[i]*ans的值,题目中又说了,舍去k项,而我们要使

2015-10-06 15:37:10 392

原创 poj3045

这道题目看了下题解,想法真棒。 题目中所求的是将最大风险最小化。那么对于某个牛i,假设它+它上面的牛的总重量为sum,那么它的风险就为(sum-a[i].w)-a[i].s,即 sum-(a[i].w+a[i].s),从这个式子可以看出,a[i].w+a[i].s越大越好,所以我们将w+s的大小排序,大的放下面,小的放上面,然后遍历一遍,找到最大风险,此时的最大风险就是最小的了。#include

2015-10-06 12:16:07 592

原创 poj 3104

题意易懂。 如果枚举的话,肯定会超时。所以我们用二分来得出最小的时间。假设此时我们最小时间为mid,那么对于衣服的含水量a[i]<=mid的来说,我们不必用吹风机去干燥它,只需让它自然风干即可。 那么对于a[i]>mid的来说,最好的方案就是先用吹风机吹,再自然风干。我们设用吹风机吹了c次(也就是用了c分钟),自然风干的时间就是mid-c,则 mid-c+c*m>=a[i],m是吹风机吹一次能够

2015-10-06 11:16:00 394

原创 poj 3273

刚开始没有注意到 每个月都得在一组里面,即当a[i]>当前的最大值时,是不符合条件的。 答案的话明显用二分,二分那个最大花费就行。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#includ

2015-10-06 10:13:02 291

原创 poj3258

二分题目所求的最大的最短距离即可。 每二分得到一个距离x,我们就看看相邻两块石头之间的距离是否大于等于x,否则的话就移除编号大的石头,直到符合条件为止。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vect

2015-10-06 09:37:20 349

原创 poj 3421

题目给出一个X,求从1到X列出一串数字X0,X1,X2..Xm使得 X0=1,Xm=X,Xi < Xi+1 且Xi+1%Xi=0的m的最大值及方法数 此题本质是让你求X的素数因子,然后进行组合。 比如我们有个100, 100=2^2 * 5^2,那么m的最大值为2+2=4,方法数为4!/(2!+2!) 我们可以这样将100的素数因子排列, 2 2 5 5,那么从前往后乘,得到1 2 4 20

2015-10-05 17:07:39 318

原创 poj1930

无限循环小数化分数的问题。 首先,题目的意思是后面的….可能重复任意的小数部分,所以我们得枚举循环的部分。 结论是这样的: 假设有个无限循环小数0.abcdefgh…..非0部分长度为len 那么我们令其非循环部分长度为c(设为abcde),循环部分为k(fgh),c+k=len 我们先计算出 abcdefgh.循环部分(tmpa),即0.abcdefgh*10^len 再计算出 abc

2015-10-05 11:18:06 344

原创 scu 4444 travel

链接这道题目很新颖,但是不会做(:зゝ∠)。看了下叉姐的代码,简单易懂。 题目大意是给你n个点,我们知道最多存在n*(n-1)/2条边,其中m条边是题目给出的,经过它们需要花费的时间为a,另外剩下的花费时间为b(为了方便,我们就叫a边和b边)问你从起点到终点(1号点到n号点),需要花费的最短时间是多少。 思路是这样的,我们先用临界表将所有的边存储下来,然后在以起点为开头的邻接表中找是否有直接到终

2015-10-02 17:09:40 724

原创 scu 4438 Censor

之前做过类似的题目,不过因为匹配串长度较短,所以都是直接模拟的,而此题字符串的长度比较长,所以我们得用KMP。 先用KMP得到匹配串w的next数组,然后匹配两个串,边匹配边用栈模拟,栈维护主串每次匹配到匹配串的哪个位置,然后如果匹配到了整个串,那么将栈顶的 |匹配串 |全部删除,然后使得匹配串的位置移动到当初记录的位置,继续与主串进行匹配。#include<stdio.h>#include<i

2015-10-01 17:51:14 574

原创 AOJ 2249

优先队列+Dijkstra 因为题目中所给的点的个数多达10000个,而且看得出来要求最短路,但是普通的Dijkstra的效率为O(n^2),这显然是不行的,那么我们可以用优先队列+DIjkstra。题目中说了,要求去掉一些边,使得总花费最少,但是去掉边后不能影响从源点到其他所有点的最短路。那么与普通的相比,就是当dis[v] == dis[u] + r [u] [v]时是cost[v]小还是co

2015-09-30 23:24:17 368

原创 Aoj 2170

简单的并查集应用。 不过注意,我们平常用的路径压缩在这里就不能用了,因为我们并不更新路上的所有结点到同一个并查集中去,这里只是做查询的用途。 题目中当mark一个点时,我们就用fa[x]=x去更新某个点,使它作为一个并查集的根节点,然后如果要查询离x最近的mark点,那么我们就逐渐网上找,找到第一个fa[x]=x的点,然后返回它的值,注意,这过程中我们不能进行路径压缩。#include<stdi

2015-09-29 14:09:48 498

原创 poj 1330

LCA裸题。 这里我用tarjan(dfs+并查集)的方法进行离线处理。 这是第一个例子的图,题目中求的是16和7的LCA,那么这个过程是这样的。 我们从根节点,即8号开始搜索,每次计算完LCA(u)以后,那么我们就处理了以u为根节点的子树,比如我们计算了4,6,15,7那么这棵子树就为一个集合,然后它们的根节点为4,然后再从4往右边走,当我们走到16时,发现7已经被处理过了,说明此时它们

2015-09-17 20:38:12 244

原创 poj 1703

经典的并查集问题。 我们可以有两种做法: 第一种是我们用一个数组vis[i]=j来表示i的敌人是j,那么我们在知道a,b是敌人之后,那么如果vis[a]有值的话,vis[a]和b是一伙的,如果vis[b]的有值的话,vis[b]和a是一伙的。所以这样判断即可。#include<stdio.h>#include<iostream>#include<string>#include<string

2015-09-17 19:14:06 266

原创 poj 2236

并查集应用的简单题。对于每一个修好的电脑,我们遍历所有已经修好的电脑,如果它们之间的距离小于等于d,那么我们就将两个集合合并到一起,在询问是否能够互通时,就看它们是否属于同一个集合,但是我们不能写成fa[x] == fa[y],而应该写成find(x)==find(y),因为有可能有些节点并没有进行路径压缩,进而也没有在同一个集合中,所以我们得再压缩一下。#include<stdio.h>#inc

2015-09-17 18:25:59 286

原创 poj 2010

这道题目刚开始还真不好想,看了别人的解题思路之后恍然大悟,思路太棒了~ 题目大意是给你三个值,N,C,F,C代表有C头牛,N为奇数,代表要在C头牛中选择N头牛,每头牛有两个值,分数和代价,使得被选中的N头牛的中位数尽量大,并且它们的代价和不能超过C。 刚开始将所有的牛按照分数大小排序,然后我们用lower[i]来表示前i头牛中(不包括第i头牛)代价和最小的N/2头牛的总代价和,那么我们从头开始扫

2015-09-17 10:22:12 350

空空如也

空空如也

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

TA关注的人

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