4399 3月19日的java笔试 算法题
三道算题均只能提交样例 思路不一定对
1.有n座基地并排相连,每座基地有一定数额的财宝,对应一定的价值。一个小偷可以拿走任意座基地的财宝,为了不被发现他不能拿走相邻基地的财宝。求出它可以获得的最大财报价值。
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] data = in.nextLine().split(",");
data[data.length - 1] = data[data.length - 1].trim();//去掉最后一个数后可能会有的空格
int[] nums = new int[data.length + 5];
for (int i = 0; i < data.length; ++i) {
nums[i + 1] = Integer.parseInt(data[i]);
}
int[] get = new int[data.length + 5];
int result = 0;
//首先拿取的基地的价值要相邻周围基地的价值
for (int i = 1; i <= data.length; ++i) {
if (nums[i] > nums[i - 1] + nums[i + 1]) {
result += nums[i];
get[i] = 1;
}
}
//然后拿取一下剩余还可以拿的其它基地的价值
for (int i = 1; i <= data.length; ++i) {
if (get[i] != 1 && get[i - 1] != 1 && get[i + 1] != 1) {
result += nums[i];
get[i] = 1;
}
}
System.out.println(result);
}
2.一个大数a减去一个大数b(a>=b),用字符串来接收数据,然后计算a-b的结果。
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a=in.next();
String b=in.next();
int la=a.length();
int lb=b.length();
int[] A=new int[la+1];
int[] B=new int[lb+1];
for (int i = 1; i <= la; i++) A[i]=Integer.parseInt(""+a.charAt(i-1));
for (int i = 1; i <= lb; i++) B[i]=Integer.parseInt(""+b.charAt(i-1));
int result=0;
int p=1;
//手算加减法的模拟
for (int i = la,j=lb; i >=1&&j>=1; i--,j--) {
int temp=A[i]-B[j];
if(temp>=0) result+=p*temp;
else {
int k=i-1;
while (k>=1){
if (A[k]>0) {
A[k++]--;
while(k!=i) {
A[k++]+=9;
}
A[k]+=10;
result+=p*(A[k]-B[j]);
break;
}
else --k;
}
}
p=p*10;
}
System.out.println(result);
3.有n+1座基地,从0到n编号,从1号基地到n号基地每座基地有一定的高度。一个人位于第0号基地,他的初始能量为E,他需要从0号基地逐个跳到第n号基地。如果下一座要跳的第i号基地的高度比自身的能量E大,那么他会损失(height[i]-E)的能量,反之他会获得(E-height[i])的能量。在跳至n号基地的过程中,他的E值不能为负数,求出满足题意的最小能量值。
public class Main10 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int[] height=new int[n+5];
int maxHeight=0;
for (int i = 1; i <=n; i++) {
height[i]=in.nextInt();
maxHeight=Math.max(maxHeight,height[i]);
}
//可以用二分找出满足条件的最小值
int left=0,right=maxHeight;
int result=right;
while (left<right){
int mid=(left+right)>>1;
int curE=mid;
boolean flag=true;
for(int i=1;i<=n;++i){
if (mid>=height[i]) mid+=mid-height[i];
else mid-=height[i]-mid;
if (mid<0) {
flag=false;
break;
}
}
if (flag) {
result=Math.min(result,curE);
right=mid;
}else {
left=curE+1;
}
}
System.out.println(result);
}
