今天想从不一样的角度来解题:从时间紧张暴力求解到思路阔达直接通过所有案例
暴力方法:
思路第一眼看到这个问题我就想到了第一个思路就是先用两个数组一个存石子数一个存颜色状态,每次遍历一遍看看有没有相邻石子颜色一样且为和最小的。
import java.util.*;
public class Main {
public static void main(String []args) {
Scanner a = new Scanner(System.in);
int n = a.nextInt();
int []b=new int [n];
int []c=new int [n];
for(int i = 0;i<n;i++) {
b[i]=a.nextInt();
}
for(int i = 0;i<n;i++) {
c[i]=a.nextInt();
}
boolean flag = true;
int sum = 0;
while(flag) {
//
boolean flag1 = false;
int min =Integer.MAX_VALUE;
int mj = n-1;
for(int i =0;i<n-1;i++) {
if(c[i]==c[i+1]){
if(min>(b[i]+b[i+1])) {
min=b[i]+b[i+1];
mj=i;
flag1=true;
}
}
}
//System.out.println("最小坐标:"+mj);
if(flag1) {
sum= sum+min;
}
if(mj==n-1) {
System.out.println(n+" "+sum);
break;
}
else if((c[mj]+1)>2) {
c[mj]=0;
//System.out.println("变0");
}
else c[mj]=c[mj]+1;
// for(int i = 0;i<n;i++) {
// System.out.print(c[i]+",");
// }
// System.out.println();
for(int i=0;i<n-1;i++) {
if(i==mj) {
b[i]=min;
}
else if(i>mj) {
b[i]=b[i+1];
c[i]=c[i+1];
}
}
n--;
}
}
}
案例通过一部分,有问题的点在于有可能并不能合成数量最小的堆,比如:
5
5 10 1 8 6
0 0 0 2 2
按理来说
可以
0 0 0 0
1 1
2
合成一堆的
按这个算法只能
0 1 2 2
0 1 0
只能三堆了。
明天得再思考思考
易错点:
1.比较左右两边时(冒泡是一个例子)从头遍历到尾是会越界的,要注意这个可能的情况(一开始找半天,因为最后一个数不能和右边的比较了,右边没数了)