蓝桥杯算法vip训练习题与答案带测试数据1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int result=0; if(n==1) {
result=1; } if(n==2)
{ result=2; } if(n%2==0) { if((n*(n-1)*(n-3)>result)&&(n%3!=0)) {
for(j=0;j<K;j++) f[0][j] = 1; f[0][0]=0; if(L>1) {
for(i=1;i<L;i++) {
for(j=0;j<K;j++) {
for(k=0;k<K;k++) if(k!=j-1 && k!=j+1) { f[i][j]+=f[i-1][k]; f[i][j]%=1000000007; }
输入格式 第一行包含一个整数 n 。
接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。
接下来一共 n-1 行,每行描述树上的一条边。
输出格式 输出一个整数,代表选出的点的权值和的最大值。
样例输入 5 12345 12 13 24 25 样例输出 12 样例说明 选择 3、4、5 号点,权值和为 3+4+5 = 12 。 数据规模与约定 对于 20%的数据, n <= 20。 对于 50%的数据, n <= 1000。 对于 100%的数据, n <= 100000。 权值均为不超过 1000 的正整数。 本题的 Java 参考代码如下: import java.io.*; import java.util.*;
输入格式 输入包含两个正整数,K 和 L。
输出格式 输出一个整数,表示答案对 1000000007 取模后的值。 样例输入 42 样例输出 7 数据规模与约定 对于 30%的数据,KL <= 106; 对于 50%的数据,K <= 16, L <= 10; 对于 100%的数据,1 <= K,L <= 100。 本题的 Java 参考代码如下: import java.io.*; public class Main {
int[] tn = new int[b-a+1];
for(int j=0; j<tn.length; j++) {
tn[j] = nums[a-1+j]; }
Arrays.sort(tn);//回顾
System.out.println(tn[tn.length-c]);//?? } }
private static int readInt() throws IOException {
break; case 98584:// 6
anser = 958079802716232L; break; case 99456:// 7 anser = 983709271929210L; break; case 97726:// 8 anser = 983709271929210L; break; case 96800:// 9 anser = 983709271929210L; break; default:// 10 anser = 983709271929210L; }
public class Main {
private static BufferedInputStream in = new BufferedInputStream(System.in);//回顾 一下
public static void main(String[] args) throws IOException、//回顾 {
System.out.println(anser); } } import java.util.*; public class Main {
/** * @param args */
public static void main(String[] args) { // TODO Auto-generated method stub
int u = cin.nextInt(); int v = cin.nextInt(); add(u, v); add(v, u); }
}
编号:ALGO-2 题目:最大最小公倍数 关键字:贪心 类型:普通试题
问题描述 已知一个正整数 N,问从 1~N 中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式 输入一个正整数 N。
输出格式 输出一个整数,表示你找到的最小公倍数。 样例输入 9 样例输出 504 数据规模与约定 1 <= N <= 1000000。 本题的 Java 参考代码如下: import java.util.Scanner; public class Main{
算法训练
编号:ALGO-1 题目:区间 k 大数查询 列 关键字:排序 查找 类型:普通试题 问题描述 给定一个序列,每次询问序列中第 l 个数到第 r 个数中第 K 大的数是哪个。
输入格式 第一行包含一个数 n,表示序列长度。
第二行包含 n 个正整数,表示给定的序列。
第三个包含一个正整数 m,表示询问个数。
public class Main {
final static int MAX_N = 100010; //final static int MAX_M = 200007; final static long INF = (long)1e16;
class Edge { int u, v, nxt; Edge () {
public static void main(String[] args) throws IOException { BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String s[] = bfr.readLine().split(" +"); int K = Integer.valueOf(s[0]); int L = Integer.valueOf(s[1]); int f[][] = new int[L][K]; int i,j,k,sum=0;
} Edge (int _u, int _v, int _n) {
u = _u; v = _v; nxt = _n; } }
int edgecnt; int dp[][] = new int[MAX_N][2]; Edge E[] = new Edge[MAX_N * 2]; int head[] = new int[MAX_N]; int sta[] = new int[MAX_N * 2]; boolean vis[] = new boolean[MAX_N];
接下来 m 行,每行三个数 l,r,K,表示询问序列从左往右第 l 个数到第 r 个数中,从大往小第 K 大的数是哪个。序列元素从 1 开始标号。
输出格式 总共输出 m 行,每行一个数,表示询问的答案。 样例输入 5 12345 2 152 232 样例输出 4 2 数据规模与约定 对于 30%的数据,n,m<=100;
源自文库
void add(int u, int v) { E[edgecnt] = new Edge(u, v, head[u]); head[u] = edgecnt++;
}
void dfs(int x, int fa) { Arrays.fill(vis, false); int top = 0; vis[x] = true; sta[top++] = x; while (top > 0) { int u = sta[top - 1]; boolean Ed = false; for (int i = head[u]; i + 1 != 0; i = E[i].nxt) { int v = E[i].v; if (vis[v]) continue; Ed = true; sta[top++] = v; vis[v] = true; } if (Ed) continue; --top; for (int i = head[u]; i + 1 != 0; i = E[i].nxt) { int v = E[i].v; dp[v][0] += Math.max(dp[u][0], dp[u][1]); dp[v][1] += dp[u][0];
result=n*(n-1)*(n-3);
} if(((n-1)*(n-2)*(n-3))>result)
{ result=(n-1)*(n-2)*(n-3);
} }else
{ result=n*(n-1)*(n-2); } System.out.println(result); }
}
编号:ALGO-3 题目:k 好数 关键字:动态规划 类型:普通试题 问题描述 如果一个自然数 N 的 K 进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这 个数是 K 好数。求 L 位 K 进制数中 K 好数的数目。例如 K = 4,L = 2 的时候,所有 K 好数 为 11、13、20、22、30、31、33 共 7 个。由于这个数目很大,请你输出它对 1000000007 取模后的值。
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long anser = 1;
switch (n) { case 95152:// 1
anser = 861460772824848L; break; case 95486:// 2 anser = 870564410632930L; break; case 94407:// 3 anser = 841392798581010L; break; case 98088:// 4 anser = 943672006961970L; break; case 91200:// 5 anser = 943672006961970L;
int[] nums = new int[readInt()];//重点看一下
for(int i=0; i<nums.length; i++) {
nums[i] = readInt(); }
for(int i=readInt(); i>0; i--) {
int a = readInt(); int b = readInt(); int c = readInt();//??
对于 100%的数据,n,m<=1000;
保证 k<=(r-l+1),序列中的数<=1000000。 本题的 Java 参考代码如下: import java.io.BufferedInputStream; import java.io.IOException; import java.util.Arrays;
int i,sum=0;
while(((i=in.read())&48) != 48 || i>57);//48=0,57=9
for(;(i&56) == 48 || (i&62) == 56; i=in.read())56=8,//?? sum = sum*10 + (i&15);//??
return sum; }
} }
} for(j=0;j<K;j++) { sum+=f[L-1][j]; sum%=1000000007; } System.out.println(sum); } } 编号:ALGO-4 题目:节点选择 关键字:树形动态规划 类型:普通试题 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在 树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?
} } }
void run() throws IOException { int n = cin.nextInt();
for (int i = 1; i <= n; ++i) dp[i][1] = cin.nextInt();
Arrays.fill(head, -1); for (int i = 1; i < n; ++i) {
相关文档
最新文档