第十二届蓝桥杯大赛模拟赛(第三期)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+。不再改了。本人水平有限,如果有写的不正确的地方还请各位大佬批评指正。有什么不太理解的地方留言给我。
欢迎关注我,一起学习一起进步,干!!
若能点赞,评论,转发那就更好不过了呢!
一起坚持改变,然后惊艳所有人~