第一题
题目描述
具体问题我记不住了,我大概描述一下,就是给定一个数组,array[N],你可以用array[k+1]更新array[k],也就是用数组后边的数更新前边的,用最少的次数是的整个数组和最大。
比如:
10 5 5 7 6 8
最后就是:10 8 8 8 8 8 和为50
解题思路&代码解析
从后往前遍历数组,维护一个最大值更新数组。
import java.util.Arrays;
/**
* @ClassName Main2
* @Description :TODO
* @Author Josvin
* @Date 2021/06/13/22:38
*/
public class Main2 {
public static void main(String[] args) {
int[] array = {10, 6, 6, 7, 4, 6};
int count = Helper(array);
System.out.println(count);
System.out.println(Arrays.toString(array));
}
private static int Helper(int[] array) {
int count = 0;
if (array.length <= 1) {
return count;
}
int max = array[array.length - 1];
for (int i = array.length - 2; i >= 0; i--) {
if (array[i] < max) {
count++;
array[i] = max;
} else {
max = array[i];
}
}
return count;
}
}
第二题
题目描述
这是杭电一道题描述见:杭电ACM HDU 2616 Kill the monster
解题思路&代码解析
具体思路可以见上边链接,在这里我附上Java代码。
import java.util.Scanner;
/**
* @ClassName Main
* @Description :TODO
* @Author Josvin hdu2616
* @Date 2021/06/11/15:55
*/
public class Main {
public static int[][] array;
public static int[] mark;
public static int ans;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
while (num-- > 0) {
int n = scanner.nextInt();
int m = scanner.nextInt();
array = new int[n][2];
for (int i = 0; i < n; i++) {
array[i][0] = scanner.nextInt();
array[i][1] = scanner.nextInt();
}
mark = new int[n];
ans = 2 * n;
for (int i = 0; i < n; i++) {
mark[i] = 1;
dfs(i, m, 1);
mark[i] = 0;
}
if (ans != 2 * n) {
System.out.println(ans);
} else {
System.out.println(-1);
}
}
}
private static void dfs(int pos, int hp, int res) {
if (hp <= array[pos][1]) {
hp -= 2 * array[pos][0];
} else {
hp -= array[pos][0];
}
if(hp <= 0)
{
ans = Math.min(ans,res);
return;
}
for(int i = 0 ; i < array.length ; i ++)
{
if (mark[i] != 0) {
mark[i] = 1;
dfs(i, hp, res + 1);
mark[i] = 0;
}
}
}
}