前面两题是c的,跟着别的博客搞错了,后面去蓝桥官网下了真题。后面的正确。

1.标题:换零钞

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

x星球的钞票的面额只有:100元,5元,2元,1元,共4种。
小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。
小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,
剩下的当然都是5元面额的。


银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗?
(5元,2元,1元面额的必须都有,不能是0)
---------------------
 思路:直接枚举还算列公式推都很快。

package lq2018_gs;

public class t1 {
	public static void main(String[] arg) {
		
		for(int q = 1; q < 100; q++) {
			for(int y = 1; y < 500; y++) {
				if(5 * y + q * 21 == 200) {
					System.out.println("q = " + q +"; " + "y = " + y + "; sum = " + (q * 11 + y));
//					break;
				}
			}
		}
		
		
	}
}
/*
 * answer:
q = 5; y = 19; sum = 74
*/

  

  

2.标题:激光样式

x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱。
安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!
国王很想知道,在目前这种bug存在的情况下,一共能打出多少种激光效果?


显然,如果只有3台机器,一共可以成5种样式,即:
全都关上(sorry, 此时无声胜有声,这也算一种)
开一台,共3种
开两台,只1种


30台就不好算了,国王只好请你帮忙了。


要求提交一个整数,表示30台激光器能形成的样式种数。
---------------------
 思路:直接dfs吧。

package lq2018_gs;

public class t2 {
	public static long ans = 0;
	public static long N = 30;
	
	public static void main(String[] arg) {
		int a[] = new int[30];
		dfs(0, 0, a);
		System.out.println(ans);
		
	}
	public static void dfs(int x, int f, int[] a) {
		if(x == N) {
			ans++;
//			for(int i = 0; i < N; i++) {
//				System.out.print(a[i] + " ");
//			}
//			System.out.println();
			return ;
		}
		if(f == 0) { // 上一次没点,这次可以点或者不点
			a[x] = 1;
			dfs(x + 1, 1, a);
			a[x] = 0;
			dfs(x + 1, 0, a);
		}
		else {
			a[x] = 0;
			dfs(x + 1, 0, a);
		}
	}
}
/*
 * ans = 2178309
 */

 

 javaB组国赛真题:

1、标题:三角形面积

已知三角形三个顶点在直角坐标系下的坐标分别为:
(2.3, 2.5)
(6.4, 3.1)
(5.1, 7.2)

求该三角形的面积。

注意,要提交的是一个小数形式表示的浮点数。
要求精确到小数后3位,如不足3位,需要补零。

-------------------------------------------------------------------

my code:

package lq2018_gs;

public class t11 {
	public static void main(String[] arg) {
		double x[] = {2.3, 6.4, 5.1};
		double y[] = {2.5, 3.1, 7.2};
//		double x[] = {0, 4, 0};
//		double y[] = {3, 0, 0};  // test: s = 6
		
		double l[] = new double[3];
		l[0] = Math.sqrt((x[0] - x[1]) * (x[0] - x[1]) + (y[0] - y[1]) * (y[0] - y[1]));
		l[1] = Math.sqrt((x[0] - x[2]) * (x[0] - x[2]) + (y[0] - y[2]) * (y[0] - y[2]));
		l[2] = Math.sqrt((x[2] - x[1]) * (x[2] - x[1]) + (y[2] - y[1]) * (y[2] - y[1]));
		
		double p = (l[0] + l[1] + l[2]) / 2;
		
		double s = Math.sqrt(p * (p - l[0]) * (p - l[1]) * (p - l[2]));
		
		System.out.println(s);
		
	}
	
	
}
/*
 * answer = 8.795
 */

  

某位大佬的:https://www.cnblogs.com/xiexinxinlove/p/3708147.html

package lq2018_gs;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
        double x1 = sc.nextDouble();
        double y1 = sc.nextDouble();
        double x2 = sc.nextDouble();
        double y2 = sc.nextDouble();
        double x3 = sc.nextDouble();
        double y3 = sc.nextDouble();
        //        if()
        double area = Math.abs(((x1*y2+x2*y3+x3*y1)-(y1*x2+y2*x3+y3*x1))/2);
        System.out.println(String.format("%.3f", area));
	}

}
/*
2.3 2.5
6.4 3.1
5.1 7.2
*/

  

2、标题:最大乘积

把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。

比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...

符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?

注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)

--------------------------

思路:就是全排列,然后枚举每个排列结果中乘号的位置,暴力吧,而且会有重复,但是只要最大嘛,不影响结果。

package lq2018_gs;

public class t22 {
	public static int[] data = new int[10];
	public static int[] vist = new int[10];
	public static long max_ans = 0;
	public static long N = 9;
	public static long CT = 0;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub 362880
		
		dfs(1);	
//		System.out.println(CT);
		System.out.println(max_ans);
		
	}

	public static void dfs(int ct) {
		if(ct == N + 1) {
			CT++;
//			for(int i = 1; i <= N; i++) {
//				System.out.print(data[i] + " ");
//			}
//			System.out.println();
			for(int i = 1; i <= 8; i++) {
				long le = 0, rt = 0;
				for(int j = 1; j <= i; j++) {
					le = le * 10 + data[j];
				}
				for(int j = i + 1; j <= 9; j++) {
					rt = rt * 10 + data[j];
				}
				long ans = le * rt;
				int temp[] = new int[10];
				int f = 1;
				while(ans != 0) {
					int t = (int) (ans % 10);
					if(temp[t] == 1 || t == 0) {
						f = 0;
						break;
					}
					temp[t] = 1;
					ans /= 10;
				}
				for(int k = 1; k <= 9; k++) {
					if(temp[k] == 0) {
						f = 0;
						break;
					}
				}
				if(f == 1) {
					max_ans = Math.max(max_ans, le * rt);
				}
			}
			return ;
		}
		for(int i = 1; i <= N; i++) {
			if(vist[i] == 0) {
				vist[i] = 1;
				data[ct] = i;
				dfs(ct + 1);
				vist[i] = 0;
			}
		}
	}
	
}
/*
 * answer = 839542176
 * 
 */

  


3、标题:全排列

对于某个串,比如:“1234”,求它的所有全排列。
并且要求这些全排列一定要按照字母的升序排列。
对于“1234”,应该输出(一共4!=24行):
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321

下面是实现程序,请仔细分析程序逻辑,并填写划线部分缺少的代码。

 

// 轮换前k个,再递归处理
import java.util.*;
public class A
{
	static void permu(char[] data, int cur){
		if(cur==data.length-1){
			System.out.println(new String(data));
			return;
		}
		
		for(int i=cur; i<data.length; i++){
			char tmp = data[i]; 
			for(int j=i-1; j>=cur; j--) data[j+1] = data[j];
			data[cur] = tmp;			

			permu(data, cur+1);			

			tmp = data[cur]; 
			__________________________________________ ;
			data[i] = tmp;			
		}
	}
	
	static void permu(String x){
		permu(x.toCharArray(),0);
	}
	
	public static void main(String[] args){
		permu("1234");
	}
}

 

请注意:只需要填写划线部分缺少的内容,不要抄写已有的代码或符号。

//			for(int j=cur+1; j<=i; j++) data[j-1] = data[j];
			for(int j=cur; j<i; j++) data[j] = data[j+1];

  

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄