蓝桥杯练习系统算法训练习题加答案解析java版本.pdf
《蓝桥杯练习系统算法训练习题加答案解析java版本.pdf》由会员分享,可在线阅读,更多相关《蓝桥杯练习系统算法训练习题加答案解析java版本.pdf(138页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选试题蓝桥杯练习系统算法训练习题加答案解析java版本编 制:_审 核:_出 版:算法训练编号:A L G 0-1题目:区间k大数查询列关键字:排序查找类型:普通试题问题描述给定一个序列,每次询问序列中第1个数到第1个数中第K大的数是哪个。输入格式第一行包含一个数n,表示序列长度。第二行包含n个正整数,表示给定的序列。第三个包含一个正整数m,表示询问个数。接下来m行,每行三个数1,r,K,表示询问序列从左往右第1个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。输出格式总共输出m行,每行一个数,表示询问的答案。样例输入51 2 3 4 521 5 22 3 2样例输出42数据
2、规模与约定对于3 0%的数据,n,m =1 0 0;对 于1 0 0%的数据,n,m =1 0 0 0:保证k =(r-I+l),序列中的数=1 0 0 0 0 0 0。本题的J a v a参考代码如下:i m por t c l a s s M a i nprivate static BufferedlnputStream in=new BufferedInputStream;public static void main(String args)throws lOException(int nums=new intreadlnt();for(int i=0;i0;i)(int a=read
3、lnt();int b=readlnt();int c=readlnt();int tn=new intb-a+l;for(int j=0;j57);for(;(i&56)=48|(i&62)=56;i=()sum=sum*10+(i&15);return sum;编号:ALGO-2题目:最大最小公倍数关键字:贪心类型:普通试题问题描述已知一个正整数N,问从1N中任选出三个数,他们的最小公倍数最大可以为多少。输入格式输入一个正整数N。输出格式输出一个整数,表示你找到的最小公倍数。样例输入9样例输出504数据规模与约定1 =N=1000000o本题的Java参考代码如下:import class
4、 Mainpublic static void main(String args)Scanner sc=new Scanner;int n=();long anser=1;switch(n)case 95152:;public class Main public static void main(String|args)throws lOException BufferedReader bfr=new BufferedReader(new InputStreamReader);String s=().split(+H);int K=(s0);intL=(sl);int f=new intLK;
5、int i,j,k,sum=0;for(j=0;jl)(for(i=l;iL;i+)for(j=0;jK;j+)for(k=0;kK;k+)if(k!=j-l&k!=j+l)(fiU+=fi-lk;fij%=07;for(j=0;jK;j+)sum+=fL-lj;sum%=07;)编号:ALGO-4题目:节点选择关键字:树形动态规划类型:普通试题问题描述有一棵n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少输入格式第一行包含一个整数n。接下来的一行包含n 个正整数,第 i 个正整数代表点i 的权值。接下来一共n
6、-1 行,每行描述树上的一条边。输出格式输出一个整数,代表选出的点的权值和的最大值。样例输入51 23451 21 32425样例输出12样例说明选择3、4、5 号点,权值和为3+4+5=1 2。数据规模与约定对于20%的数据,n=20o对于50%的数据,n=1000对 于 100%的数据,n=100000,权值均为不超过1000的正整数。本题的Java参考代码如下:importimportpublic class Main final static int MAX_N=100010;xt)int v=Ei.v;if(visv)continue;Ed=true;statop+=v;visv=t
7、rue;)if(Ed)continue;-top;for(int i=headu;i+1 !=0;i=Ei.nxt)int v=Ei.v;dpv0+=(dpu0,dpul);dpvl+=dpu|0;)void run()throws lOException int n=();for(int i=1;i=n;+i)dpil=();(head,-1);for(int i=1;i n;+i)int u=();int v=();add(u,v);add(v,u);)dfs(l,-1);int ans=(dpl0,dPll);(ans);0;public static void main(String
8、args)throws lOException new Main().run();)Main()cin=new InputReader;importclass Main(static int n,m;static int u;static int v;static int w;static int d;static int first;static int next;static Queue q=new LinkedList();static booleanf inq;public static void main(String args)throws lOException(int i;Bu
9、fferedReader bfr=new BufferedReader(new InputStreamReader);String str=();String s=(M sn);n=(s0);m=(sl);n+;m+;u=new intm;v=new intm;w=new intm;first=new intfn;next=new intm;d=new intn;inq=new booleann;for(i=l;in;i+)firsti=-l;fbr(i=l;im;i+)(str=();s=);ui=(s0);vi=(sl);wi=(s2);nexti=firstui;firstui=i;sp
10、fa(l);for(i=2;in;i+)public static void spfa(int s)(int i,x;for(i=2;idx+wi)(dvi=dx+wi;if(!inqvi)(inqvi=true;(vi);)编号:ALGO-6题目:安慰奶牛关键字:最小生成树类型:普通试题问题描述Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到 N o 每一个牧场都是一个奶牛的家。F J计划除去P 条道路中尽可能多的道路,但是还要保持牧场之间的连通性。你首先要决定那些道路是需要保留的N-1条道路。第 j 条双向道路连接了牧
11、场Sj和 Ej(l=Sj=N;1 =Ej=N;Sj!=Ej),而且走完它需要L j的时间。没有两个牧场是被一条以上的道路所连接。奶牛们非常伤心,因为她们的交通系统被削减了。你需要到每一个奶牛的住处去安慰她们。每次你到达第i 个牧场的时候(即使你已经到过),你必须花去C i的时间和奶牛交谈。你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。在早上起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。这样你才能完成你的交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。输入格式第 1行包含两个整数N 和 Po接下来N
12、行,每行包含一个整数Ci。接下来P 行,每行包含三个整数Sj,Ej和 Lj。输出格式输出一个整数,所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。样例输入571010206301 2523524 1234 1725 15356样例输出176数据规模与约定5=N=10000,N-l=P=100000,0=Lj=1000,1 =Ci=1,000。本题的Java参考代码如下:import Reader3 static BufferedReader reader;static SlringTokenizer tokenizer;static void init(InputStream in
13、put)reader=new BufferedReader(new InputStreamReader(input);tokenizer=new StringTokenizer(n);)static String next()throws IOExceptionwhile(!()tokenizer=new StringTokenizer();return();static int nextlnt()throws IOExceptionreturn(next();)static double nextDouble()throws IOExceptionreturn(next();class Kr
14、uskalDuiint a,b,l;)public class Main/*param args*throws lOException*/static int father=new int 100000;static ArrayList path=new ArrayList();public static int getfather(int x)if(x!=fatherx)fatherx=getfather(fatherx);)return fatherx;)public static void _qst_w(inl l,int r)int i=l,j=r,mw=(i+j)/2).l;whil
15、e(i=j)while(i).lmw)j;if(i=j)(path,i,j);i+;j-;)if(lj)_qst_w(l,j);if(ir)_qst_w(i,r);)public static void main(String args)throws lOException fy=getfather(k).b);if(fx!=fy)fatherfx=fy;result+=(k).l;count+;)k+;)编号:ALGO-7题目:逆序对关键字:平衡二叉树类型:普通试题问题描述Alice是一个让人非常愉跃的人!他总是去学习一些他不懂的问题,然后再想出许多稀奇古怪的题目。这几天,Alice又沉浸在
16、逆序对的快乐当中,他已近学会了如何求逆序对对数,动态维护逆序对对数等等题目,他认为把这些题让你做简直是太没追求了,于是,经过一天的思考和完善,Alice终于拿出了一道他认为差不多的题目:有一颗2n-l个节点的二叉树,它有恰好n 个叶子节点,每个节点上写了一个整数。如果将这棵树的所有叶子节点上的数从左到右写下来,便得到一个序列a l-a n,现在想让这个序列中的逆序对数量最少,但唯一的操作就是选树上一个非叶子节点,将它的左右两颗子树交换。他可以做任意多次这个操作。求在最优方案下,该序列的逆序对数最少有多少。Alice自己已近想出了题目的正解,他打算拿来和你分享,他要求你在最短的时间内完成。输入格
17、式第一行一个整数n。下面每行,一个数X。如果x=0,表示这个节点非叶子节点,递归地向下读入其左孩子和右孩子的信息,如果xW0,表示这个节点是叶子节点,权值为X。输出格式输出一个整数,表示最少有多少逆序对。样例输入300312样例输出1数据规模与约定对于20%的数据,n=5000o对于 100%的数据,1 =n=200000,0=a i 2A31该题暂时没有人完全正确,暂时没有该语言的参考程序。编号:ALGO-8题目:操作格子关键字:线段树类型:普通试题问题描述有 n 个格子,从左到右放成一排,编号为1-n。共有m 次操作,有 3 种操作类型:1.修改一个格子的权值,2.求连续一段格子权值和,3
18、.求连续一段格子的最大值。对于每个2、3 操作输出你所求出的结果。输入格式第一行2 个整数n,mo接下来一行n 个整数表示n 个格子的初始权值。接下来m 行,每行3 个整数p,x,y,p 表示操作类型,p=l时表示修改格子x 的权值为y,p=2时表示求区间 x,y 内格子权值和,p=3时表示求区间 x,y 内格子最大的权值。输出格式有若干行,行数等于p=2或 3 的操作总数。每 行 1个整数,对应了每个p=2或 3 操作的结果。样例输入4312342 1 31433 1 4样例输出63数据规模与约定对于 20%的数据 n=100,m=200对于 50%的数据 n=5000,m=5000。对于
19、100%的数据 1 =n=100000,m=100000,0 =格子权值 =10000。本题的Java参考代码如下:importimportpublic class Main final static int MAX_N=100007;class Node int 1,r;int sum,max;Node()Node(int _1,int _r,int _s,int _m)1 =J;r=_r;sum=_s;max=_m;int n,m;Node tree=new NodeMAX_N 2;int a=new intMAX_N;void up(int id)treeid.sum=treeid l.
20、sum+treeid 1|l.sum;tree id,max=(treeid l.max,treeid 1|l.max);)void build(int id,int 1,int r)tree id=new Node。0,0);if(l=r)treeid.sum=treeid.max=al;return;int mid=(1+r)1;build(id 1,1,mid);build(id 1|1,mid+1,r);up(id);void update(int id,int pos,int val)if(treefid.1 =treeid.r)treeid.sum=treeid.max=val;r
21、eturn;int mid=(treeid.l+treeid.r)1;if(pos=mid)update(id 1,pos,val);else update(id 1|1,pos,val);up(id);)int sum(int id,int 1,int r)if(1=treeid.l&treeid.r=r)return treeid.sum;)int mid=(treeid.l+treeid.r)1;if(r mid)return sum(id 1|1,1,r);else return sum(id 1,1,mid)+sum(id 1|1,mid+1,r);int max(int id,in
22、t 1,int r)if(l=treeid.l&treeid.r=r)return treefid.max;)int mid=(treeid.l+treeid.r)1;if(r mid)return max(id 1|1,1,r);else return(max(id 1,1,mid),max(id 1|1,mid+1,r);)void run()throws lOException n=();m 二 ();for(int i=1;i=n;+i)ai=0;build(l,1,n);for(int i=0;i m;+i)int type=();inti=();int r=();if(type=1
23、)update(l,1,r);else if(type=2)(sum(l,lt r);else(max(l,1,r);0;)public static void main(String args)throws lOException new Main().run();Main()cin=new InputReader;序列中的所有数都是不大于k 的正整数;2.序列中至少有两个数。3.序列中的数两两不相等;4.如果第i-1个数比第i-2 个数大,则第i 个数比第i-2 个数小;如果第i-1个数比第i-2 个数小,则第i 个数比第i-2 个数大。比如,当 k=3 时,有下面几个这样的序列:1 21
24、 32 12 1 32323 13 132一共有8 种,给定k,请求出满足上面要求的序列的个数。输入格式输入包含了一个整数ko(k=20)输出格式输出一个整数,表示满足要求的序列个数。样例输入3样例输出本题的Java参考代码如下:import.*;public class Mainpublic static void main(String args)throws IOExceptionBufferedReader bf=new BufferedReader(new InputStreamReader);int n=();编号:ALGO-10题目:集合运算关键字:数组排序类型:vip问题描述给
25、出两个整数集合A、B,求出他们的交集、并集以及B 在 A 中的余集。输入格式第一行为一个整数n,表示集合A 中的元素个数。第二行有n 个互不相同的用空格隔开的整数,表示集合A 中的元素。第三行为一个整数m,表示集合B 中的元素个数。第四行有m 个互不相同的用空格隔开的整数,表示集合B 中的元素。集合中的所有元素均为int范围内的整数,n、m=1000输出格式第一行按从小到大的顺序输出A、B 交集中的所有元素。第二行按从小到大的顺序输出A、B 并集中的所有元素。第三行按从小到大的顺序输出B 在 A 中的余集中的所有元素。样例输入51 2 34552 4 6 8 10样例输出241 2 3 4 5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蓝桥杯 练习 系统 算法 训练 习题 答案 解析 java 版本
限制150内