第十届蓝桥杯省赛原题及参考答案

 

 

思路:这一题没有看懂是要挑选出成绩峰值最大的5个人,还是根据平均值选出5个人求其峰值和;

第一种情况答案是490

第二种情况没算

我考试时没有看清题意,以为是求出这几组数据的最大值,成功避开了题意,所以第一题就很随意的凉凉了~~

思路:

截取所有可能的字符串放入hashmap中,

hashmap的特点就是:如果有重复的字符串会覆盖之前的字符串,

最后利用map.size求出集合中字符串的个数

我的答案是100

代码:

import java.util.HashMap;

public class Main {
	public static void main(String[] args) {
		String s = "0100110001010001";
//		String s = "abcd";
		HashMap<String, Integer> map = new HashMap<>();
		
		for (int i = 0; i <= s.length(); i++) {
			for (int j = i+1; j <= s.length(); j++) {
				map.put(s.substring(i, j), 1);
			}
		}
		
		System.out.println(map.size());
	}
}

思路:这道题有两种方法,递推和递归,但是递归20190324数字太大,会出现栈溢出,所以只能用递推来做

我的答案是:4659

代码:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		int a = 1,b = 1,c = 1;
		for (int i = 4; i <= n; i++) {
			int temp = (a + b + c)%100000;//为了防止超过最大整数,可以对100000取余
			a = b%100000;
			b = c%100000;
			c = temp;
		}
		
		System.out.println(c);
	}
}

思路:全排列,每一种情况都存起来

个人觉得正确答案是:40785

然而我又成功避开了正确答案,考试的时候写的是299,因为最后做的这道题,所以没有认真看,忽略了题目中“”各不相同“”四个字,真是道路千万条,我非得走有坑的那一条。。。。。。。。。

代码:

public class Main {
	public static void main(String[] args) {
		int n = 2019;
		int t = 0;
		loop:for (int i = 1; i < n; i++) {
			if((i+"").indexOf("2")!=-1||(i+"").indexOf("4")!=-1)
				continue;
			loop2:for (int j = i+1; j < n; j++) {
				if(i==j)
					continue loop2;
				if((j+"").indexOf("2")!=-1||(j+"").indexOf("4")!=-1)
					continue;
				int k = n-i-j;
				if(k<=0)
					break loop2;
				if(i==k)
					continue loop2;
				if(j==k)
					continue loop2;
				if((k+"").indexOf("2")!=-1||(k+"").indexOf("4")!=-1)
					continue loop2;
				t++;
			}
		}
		System.out.println(t/3);
	}
}

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long n = sc.nextInt();
		long num = 0;
		
		for (int i = 1; i <= n; i++) {
			String s = i + "";
			if(s.indexOf("2")!=-1||s.indexOf("0")!=-1||s.indexOf("1")!=-1||s.indexOf("9")!=-1)
				num += i;
		}
		System.out.println(num);
	}
}

思路:用二维数组a[N+1][T+1]存放订单数量,例如上面的测试例子,用二维数组(行表示时间点,列表示店铺编号)表示为:

 123456
1111000
2000012

然后用一个一维数组sum[N+1]存放每个店铺的优先级,如下表(行代表时间点):

 123456
sum[1]246543
sum[2]000026
缓存中店铺数量001111
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int order = sc.nextInt();
		int time = sc.nextInt();
		int a[][] = new int[n+1][time+1];
		int sum[] = new int[n+1];
		HashMap<Integer, Integer> map = new HashMap<>();
		
		for (int i = 0; i < order; i++) {
			int ts = sc.nextInt();
			int id = sc.nextInt();
			
			if(ts<=time)
				a[id][ts]++;
		}
		
		for (int i = 1; i < n+1; i++) {
			for (int j = 1; j < time+1; j++) {
				if(a[i][j]==0)
					sum[i] = Math.max(0, sum[i]-1);
				else
					sum[i] += a[i][j]*2;
				if(sum[i]>5)
					map.put(i, 1);
				if(sum[i]<=3&&map.containsKey(i))
					map.remove(i);
			}
		}
		System.out.println(map.size());
	}
}

思路:不管有几个减号,只要m>0,结果都为所有数相加,减去最小值的二倍;

e.g     有四个减号的表达式:a-(b-c-d-e),其实只是减了一个数b。只需要把最小的那个数给b就行了。

坑1:

可能你看了上面的表达式有所疑问,题目中没有说有括号啊,你怎么能用括号呢?这叫要说说什么是后缀表达式了,在表达式转为后缀表达式的时候,括号是被抵消了,不会出现在最后的结果中。如果还不理解,可以查看有关后缀表达式的详细介绍,在这里就不多说了。

坑2:

题目中的数组范围是:如果有200000个10^9相加会超过整数的表示范围,所以我用了大数处理,不知道会不会超时。。。

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		BigInteger min = new BigInteger("1000000000");
		BigInteger sum = new BigInteger("0");
		
		int num = n + m + 1;
		for (int i = 0; i < num; i++) {
			BigInteger temp = new BigInteger(sc.nextInt()+"");
			sum = sum.add(temp);
			min = temp.compareTo(min)==-1?temp:min;
		}
		System.out.println(sum.subtract(min.multiply(new BigInteger("2"))));
	}
}

 

  • 49
    点赞
  • 264
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值