蓝桥杯 2020省内模拟 Java实现 C组(正在考试请别点)

1:
请问十六进制数1949对应的十进制数是多少?请特别注意给定的是十六进制,求的是十进制。
(1)16进制一位代表2进制4位,然后在根据2进制求10进制即可

public class TestA {

	public static void main(String[] args) {
		System.out.println(1+8+64+256+2048+4096);
	}
}
答案:6473

2
不超过19000的正整数中,与19000互质的数的个数是多少?
(1)这就纯暴力呗

public class TestB {
	static int gcd(int a,int b){
		return b==0? a:gcd(b,a%b);
	}
	public static void main(String[] args) {
		int ans = 0;
		for(int i = 1;i < 19000;i++)
			if(gcd(i,19000) == 1)
				ans++;
		System.out.println(ans);
	}
}
答案:7200

3:
70044与113148113148的最大公约数是多少?
(1)gcd,gcd

public class TestC {
	static int gcd(int a,int b){
		return b==0? a:gcd(b,a%b);
	}
	public static void main(String[] args) {
		System.out.println(gcd(70044,113148));
	}

}
答案:5388

4:
一棵1010层的二叉树,最多包含多少个结点?
注意当一棵二叉树只有一个结点时为一层。
(1)模拟即可

public class TestD {

	public static void main(String[] args) {
		int ans = 0;
		int t = 1;
		for(int i = 1;i <= 10;i++){
			ans += t;
			t *= 2;
		}
		System.out.println(ans);
	}
}
答案:1023

5:
小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数。

如果一个数的数位不包含数字 2,小明将它称为洁净数。
请问在整数 1至 n 中,洁净数有多少个?
(1)模拟即可

import java.util.*;
public class TestE {
	static boolean get(int x){
		while(x != 0){
			int t = x%10;
			if(t == 2)
				return false;
			x /= 10;
		}
		return true;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int ans = 0;
		for(int i = 1;i <= n;i++)
			if(get(i))
				ans++;
		System.out.println(ans);
	}
}

6:
在这里插入图片描述

(1)暴力!子序列要连续,千万别想成最长上升子序列的dp了!直接暴力!

package 省内模拟C组;
import java.io.*;
import java.util.Arrays;
public class TestF {
	static int n;
	static int a[] = new int[1010];
//	static int dp[] = new int[1010];
	public static void main(String[] args) throws IOException{
		StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
		re.nextToken(); n = (int)re.nval;
		int ans = 0;
		int sum = 0;
		for(int i = 1;i <= n;i++){
			re.nextToken();
			a[i] = (int)re.nval;
			if(a[i] > a[i-1])
				sum++;
			else{
				ans = Math.max(ans, sum);
				sum = 1;
			}
		}
		pr.println(ans);
		pr.flush();
//		Arrays.fill(dp, 1);
//		for(int i = 1;i <= n;i++)
//			for(int j = 1;j < i;j++)
//				if(a[j] < a[i])
//					dp[i] = Math.max(dp[j]+1, dp[i]);
//		int ans = 0;
//		for(int i = 1;i <= n;i++)
//			ans = Math.max(ans, dp[i]);
//		pr.println(ans);
//		pr.flush();
	}
}

屏蔽的dp的代码 233 因为自己爆0了一发
7:
在这里插入图片描述
(1)就纯暴力呗

package 省内模拟C组;
import java.io.*;
public class TestG {
	static int n;
	static int a[] = new int[10010];
	public static void main(String[] args) throws IOException{
		StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
		re.nextToken(); n = (int)re.nval;
		for(int i = 1;i <= n;i++){
			re.nextToken();
			a[i] = (int)re.nval;
		}
		int ans = 0;
		for(int i = 1;i <= n;i++)
			for(int j = i+1;j <= n;j++)
				ans = Math.max(ans,j-i+Math.abs(a[j]-a[i]));
		pr.println(ans);
		pr.flush();
	}
}

8:
在这里插入图片描述
(1)就纯暴力呗

package 省内模拟C组;
import java.util.*;
public class TestH {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x = 0,y = 0;
		char a[] = sc.next().toCharArray();
		for(int i = 0;i < a.length;i++){
			if(a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
				x++;
			else
				y++;
		}
		System.out.println(x);
		System.out.println(y);
		sc.close();
	}

}

9:
在这里插入图片描述
n,m最大到1000,d到100
开始有难度了!
(1)这个题很明显,bfs的题,但是这个题问题是什么呢,他可以斜着走
(2)但是斜着走这个扩展的点可就多了,我们不可能每次扫到一个点都判断整个地图的点距离是不是满足吧
(3)因此我们可以这样,只考虑x,我们把x走i步,y最大能走的步数算出来,因为我们每次走当然是走的越远越好,所以近的点我们就没必要扩展
(4)这里借鉴了别的大佬的思路- -

package 省内模拟C组;
import java.util.*;
public class TestI {
	static int n,m;
	static double k;
	static int maxy[] = new int[1010];
	static int vis[][] = new int[1010][1010];
	static double cost(int x1,int y1,int x2,int y2){
		return Math.sqrt((double)(x1-x2)*(double)(x1-x2)+(double)(y1-y2)*(double)(y1-y2));
	}
	static void bfs(int x,int y){
		Queue<Node> q = new LinkedList<Node>();
		q.add(new Node(x,y));
		while(!q.isEmpty()){
			Node node = q.poll();
			int tx = node.x,ty = node.y;
			for(int i = 0;i <= k;i++){
				int dx = Math.min(tx+i,n);
				int dy = Math.min(ty+maxy[i],m); // 不能走超过地图的步数
				if(vis[dx][dy] == -1){ // 这个点没有走过的话
					vis[dx][dy] = vis[tx][ty]+1;
					q.add(new Node(dx,dy));
				}
			}
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		k = sc.nextDouble();
		for(int i = 1;i <= n;i++)
			Arrays.fill(vis[i], -1);
		vis[1][1] = 0;
		for(int i = 0;i <= k;i++) // x方向走i步  y方向最大走maxy[i]步
			maxy[i] = (int)Math.sqrt(k*k-i*i); 
		bfs(1,1);
		System.out.println(vis[n][m]);
		sc.close();
	}
}
class Node{
	int x,y;
	Node(int x,int y){
		this.x = x;
		this.y = y;
	}
}

10:
在这里插入图片描述
(1)首先看懂题,高度为1淹掉7块积木,高度为2淹掉13块积木,也就是说如果水的高度大于等于积木的高度,这个积木就会被淹掉,当然这个题我们是不能暴力的(当然暴力估计也能拿很多分),因为如果我们每一次都去判断的话 复杂度是 nmh 的 很明显就直接爆掉了
(2)也就是说淹掉积木的数目就等于 积木高度小于水的高度的所有积木 + 积木高度大于水的高度的种数 * 水的高度 (这个稍微想一下)因为积木高度大于水的高度只能淹掉比水高度等于或小于的那一部分,而积木高度小于水的高度的我们则可以全部淹掉

(3)好了,只要我们理解了第二点的那个公式,我们就可以做这个题了,积木小于水的高度的总数,这个我们可以用前缀和来实现。
(4)积木大于水的高度的种数,我们可以用后缀和来实现。
(5)具体看代码:sum数组表示积木高度为i的个数有多少,所以我们可以用a数组来实现前缀和:
a[i]: 1~i 积木高度的总积木数是多少
(6)b数组实现后缀和,b[i] : i+1 ~ n 积木种数有多少种

package 省内模拟C组;
import java.io.*;
public class TestJ {
	static int n,m;
	static int h;
	static int map[][] = new int[1010][1010];
	static long sum[] = new long[100010]; // 积木高度为i的个数
	static long a[] = new long[100010];
	static long b[] = new long[100010];
	public static void main(String[] args) throws IOException{
		StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
		re.nextToken(); n = (int)re.nval;
		re.nextToken(); m = (int)re.nval;
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= m;j++){
				re.nextToken();
				map[i][j] = (int)re.nval;
			}
		re.nextToken(); h = (int)re.nval;
		long cnt = 0;
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= m;j++){
				if(map[i][j] <= h)
					sum[map[i][j]]++;
				else
					cnt++;
			}
		for(int i = 1;i <= h;i++)
			a[i] = a[i-1] + sum[i]*(long)i; // 维护前缀和  比 i高度小或者等于的积木个数总和有多少个
		for(int i = h;i >= 1;i--)
			b[i] = b[i+1] + sum[i+1]; // 维护后缀和  比 i高度 高的积木种数有多少
		for(int i = 1;i <= h;i++)
			pr.println(a[i]+b[i]*i+cnt*i);
		pr.flush();
	}
}

ok,这个代码应该可以AK (正在考试的请别抄,别抄!)
结束,总结一下后面两题还是有难度的,自己第一次写的时候也没写出来,是后面补出来的,但是如果我们要硬暴力了话也能拿很多分的,所以大家写题的时候最好别空,不会就暴力233 。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值