第十二届蓝桥杯大赛模拟赛(第三期)java:第九题:购物

第十二届蓝桥杯大赛模拟赛(第三期)java组:第九题:购物

问题描述:

杂货铺老板一共有N件物品,每件物品具有ABC三种属性中的一种或多种。从杂货铺老板处购得一件物品需要支付相应的代价。现在你需要计算出如何购买物品,可以使得ABC三种属性中的每一种都在至少一件购买的物品中出现,并且支付的总代价最小。


输入格式:

输入第一行包含一个整数N。
  以下N行,每行包含一个整数C和一个只包含"ABC"的字符串,代表购得该物品的代价和其具有的属性。

输出格式:

输出一个整数,代表最小的代价。如果无论如何凑不齐ABC三种属性,输出-1。


样例输入:

5
10 A
9 BC
11 CA
4 A
5 B

样例输出:

13


数据规模和约定:

对于50%的评测用例,1 <= N <= 20
对于所有评测用例,1 <= N <= 1000, 1 <= C <= 100000


题目分析:

最长字符串满足俩个条件①和②。
①同时包含ABC。
②价值最小
设置3层循环每层循环都判断是否满足条件①,若满足条件①,当前价值和,与之前价值取最小值。
(3每层循环都要进行判断,满足直接continue)

代码实现:


import java.util.Scanner;
public class Main9 {
	static int[] num1;
	static String[] num2;
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		num1 = new int[n];
		num2 = new String[n];
		for(int i=0;i<n;i++) {
			num1[i] = in.nextInt();
			num2[i] = in.next();
		}
		int temp = 0;
		int min = Integer.MAX_VALUE;
		for (int i = 0; i < n; i++) {
			//意味当前字符串同时包含ABC
			if(run(i,-1,-1)) {
				temp=0;
				temp = num1[i];
				//如果该字符串同时包含ABC并且,他们价值和小于min,则min=temp
				if(min>temp) {
					min = temp;
				}
				continue;
			}
			for (int j = 0; j < n; j++) {
				//意味当前字符串同时包含ABC
				if(run(i,j,-1)) {
					temp=0;
					temp = num1[i]+num1[j];
					//如果该字符串同时包含ABC并且,他们价值和小于min,则min=temp
					if(min>temp) {
						min = temp;
					}
					continue;
				}
				for (int r = 0; r < n; r++) {
					//意味当前字符串同时包含ABC
					if(run(i,j,r)) {
						temp=0;
						temp = num1[i]+num1[j]+num1[r];
						//如果该字符串同时包含ABC并且,他们价值和小于min,则min=temp
						if(min>temp) {
							min = temp;
						}
						continue;
					}	
				}
			}
		}
		if(min!=Integer.MAX_VALUE) {
			System.out.println(min);
		}else {
			System.out.println(-1);
		}
	}
	//每次传要操作字符数组的下标,进行判断
	//如果包含abc则返回true,否则返回false
	public static boolean run(int index1 ,int index2 ,int index3) {
		String temp = "";
		//如果index2,index3同时为-1则说明当前操作为第一层循环
		if(index1!=-1 && index2==-1 && index3==-1) {
			temp += num2[index1];
		}
		//如果只有index3为-1则说明当前操作为第二层循环
		if(index1!=-1 && index2!=-1 && index3==-1) {
			temp += num2[index1];
			temp += num2[index2];
		}
		//如果index1,index2,index3都不为-1说明当前操作为第三层循环
		if(index1!=-1 && index2!=-1 && index3!=-1) {
			temp += num2[index1];
			temp += num2[index2];
			temp += num2[index3];
		}
		if(temp.contains("A") && temp.contains("B") && temp.contains("C")) {
			return true;
		}
		return false;
	}
}

在这里插入图片描述
今天学习到这里结束了,因为准备考研事情比较多,改为一周写3+。不再改了。本人水平有限,如果有写的不正确的地方还请各位大佬批评指正。有什么不太理解的地方留言给我。
欢迎关注我,一起学习一起进步,干!!
若能点赞,评论,转发那就更好不过了呢!
一起坚持改变,然后惊艳所有人~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不坦然

承蒙厚爱~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值