CSDN编程竞赛·第31期赛后分享

这次的题目不算难,但是没有满分的,应该都是最后一题只拿到了10%的得分,在此分享一下我的解答给大家~~
欢迎一起讨论最后一题的题解~

1、题目名称:最优利润值

你在读的经营课程上,老师布置了一道作业。在一家公司的日常运营中,是会对一些商品的价格走势根据一些经验和数据 进行预估,并据此进行决策。例如,假设某商品每天的价格都有可能变动,我们要做的就是低买高卖获得最高利润。比如 假设我们预估该商品接下来七天内的价格走势如下: 4 1 2 3 6 4 8 那我们采取的最佳策略是在价格1块钱的时候买入,在 价格8块钱的时候卖出。为了简化整个过程,我们限定在此周期内只能有一次买入一次卖出,且商品在没有购入前是无法 卖出的,即该商品不是期货而是现货。 现要求你用程序来实现自动决策。输入一定天数的商品预估价格,自动计算出最优 利润值。例如,上面的例子中,最优利润值为8-1=7。(简单起见,只考虑0-100000之间的整数价格)。

题解如下:
import java.util.ArrayList; 
import java.util.Scanner;
class Main {
    
    
	public static void main(String[] args) {
    
    
		Scanner scan = new Scanner(System.in);
		String str_0 = scan.nextLine();
		String[] line_list_0 = str_0.trim().split(" "); 
		ArrayList<Integer> arr = new ArrayList<>(); 
		for(int i = 0; i < line_list_0.length; i++) {
    
    
			arr.add(Integer.parseInt(line_list_0[i])); 
		}
		scan.close();
		int result = solution(arr); 
		System.out.println(result);
	}
	public static int solution(ArrayList<Integer> arr){
    
     
		int result = 0;
		// TODO: 请在此编写代码
		for (int i = 0; i < arr.size() - 1; i++) {
    
    
			int a = arr.get(i);
			for (int j = i + 1; j < arr.size(); j++) {
    
    
				if (arr.get(j) - a > result) {
    
     
					result = arr.get(j) - a;
				} 
			}
		}
		return result;
	}
}

2、题目名称:开学趣闻之美食诱惑

小艺酱又开学了,可是在上学的路上总会又各种意想不到的美食诱惑让小艺酱迟到。 假设小艺酱家到学校是一个n*n的矩 阵。 每个格子包含一个诱惑值p,诱惑着小艺,让她迟到。 小艺位于矩阵的左上角,学校在矩阵的右下角落。 小艺想知道 自己到达学校所要经历的最小诱惑值是?

题解如下:
import java.util.ArrayList; 
import java.util.Scanner;
class Main {
    
    
	public static void main(String[] args) {
    
    
		Scanner scan = new Scanner(System.in);
		String str_0 = scan.nextLine().trim(); 
		int n = Integer.parseInt(str_0);
		ArrayList<ArrayList<Integer>> vector = new ArrayList<>(); 
		for(int i = 0; i < n; i++){
    
    
			String str_1 = scan.nextLine();
			String[] line_list_1 = str_1.trim().split(" "); 
			ArrayList<Integer> temp_1 = new ArrayList<>(); 
			for(int j = 0; j < line_list_1.length; j++){
    
    
				temp_1.add(Integer.parseInt(line_list_1[j])); 
			}
			vector.add(temp_1); 
		}
		scan.close();
		int result = solution(n, vector); 
		System.out.println(result);
	}
	public static ArrayList<Integer> solution(int n, ArrayList<Integer> arr) {
    
     
		int result = 0;
		// TODO: 请在此编写代码
		int[][] dp = new int[n][n]; 
		dp[0][0] = vector.get(0).get(0); 
		for (int i = 1; i < n; i++) {
    
    
			dp[i][0] = vector.get(i).get(0) + dp[i - 1][0]; 
		}
		for (int i = 1; i < n; i++) {
    
    
			dp[0][i] = vector.get(0).get(i) + dp[0][i - 1];
		}
		for (int i = 1; i < n; i++) {
    
    
			for (int j = 1; j < n; j++) {
    
    
				if (dp[i - 1][j] < dp[i][j - 1]) {
    
    
					dp[i][j] = vector.get(i).get(j) + dp[i - 1][j]; 
				} else {
    
    
					dp[i][j] = vector.get(i).get(j) + dp[i][j - 1]; 
				}
			}
		}
		result = dp[n - 1][n - 1];
		return result;
	} 
}

3、题目名称:小艺照镜子

回文串是一个正读和反读都一样的字符串,已知字符串str。 输出字符串str中最长回文串的长度。

题解如下:
import java.util.ArrayList; 
import java.util.Scanner;
class Main {
    
    
	public static void main(String[] args) {
    
    
		Scanner scan = new Scanner(System.in);
		String str_0 = scan.nextLine().trim(); 
		String s = str_0;
		scan.close();
		int result = solution(s);
		System.out.println(result);
	}
	public static int solution(String s){
    
    
		int result = 0;
		// TODO: 请在此编写代码
		int len = s.length();
		char[] strs = s.toCharArray(); 
		int maxlen = 1;
		int start = 0;
		for (int i = 0; i < len - 1; i++) {
    
    
			int len1 = getLength(strs, i, i);
			int len2 = getLength(strs, i, i + 1); 
			int len3 = 0;
			if (len1 > len2) {
    
    
				len3 = len1; 
			} else {
    
    
				len3 = len2; 
			}
			if (maxlen < len3) {
    
     
				maxlen = len3;
			} 
		}
		result = maxlen;
		return result; 
	}
	private static int getLength(char[] chars, int x, int y) {
    
     
		int len = chars.length;
		while (x >= 0 && y < len && chars[x] == chars[y]) {
    
    
			x--;
			y++; 
		}
		return y - x - 1; 
	}
}

4、题目名称:爱吃鬼

小艺酱每天都在吃和睡中浑浑噩噩的度过。 可是小肚子是有空间上限v的。 小艺酱有n包零食,每包零食占据小肚子空间 ##a_i##并会给小艺酱一个甜蜜值##b_i##。 小艺酱想知道自己在小肚子空间上限允许范围内最大能获得的甜蜜 值是多少?

题解如下:
import java.util.ArrayList; 
import java.util.Scanner;
class Main {
    
    
	public static void main(String[] args) {
    
    
		Scanner scan = new Scanner(System.in);
		String str_0 = scan.nextLine();
		String[] line_list_0 = str_0.trim().split(" "); 
		ArrayList<Integer> arr_temp = new ArrayList<>(); 
		for(int i = 0; i < line_list_0.length; i++){
    
    
			arr_temp.add(Integer.parseInt(line_list_0[i])); 
		}
		int v = arr_temp.get(0); 
		int n = arr_temp.get(1);
		ArrayList<ArrayList<Integer>> vector = new ArrayList<>(); 
		for(int i = 0; i < n; i++){
    
    
			String str_2 = scan.nextLine();
			String[] line_list_2 = str_2.trim().split(" "); 
			ArrayList<Integer> temp_2 = new ArrayList<>(); 
			for(int j = 0; j < line_list_2.length; j++){
    
    
				temp_2.add(Integer.parseInt(line_list_2[j])); 
			}
			vector.add(temp_2);
		}
		scan.close();
		int result = solution(v, n, vector); 
		System.out.println(result);
	}
	public static int solution(int v, int n, ArrayList<ArrayList<Integer>> vector){
    
     
		int result = 0;
		// TODO: 请在此编写代码
		for (int i = 0; i < n - 1; i++) {
    
    
			for (int j = i + 1; j < n; j++) {
    
    
				if (0.1 * vector.get(i).get(1) / vector.get(i).get(0) < 0.1 * vector.get(j).get(1) / vector.get(j).get(0)) {
    
    
					ArrayList<Integer> arr = vector.get(i); 
					vector.set(i, vector.get(j)); 
					vector.set(j, arr);
				} 
			}
		}
		int sum = 0;
		int vt = v;
		for (int i = 0; i < n - 1; i++) {
    
    
			sum = 0;
			vt = v;
			for (int j = i; j < n; j++) {
    
    
				if (vector.get(i).get(0) < v) {
    
    
					sum += vt / vector.get(i).get(0) * vector.get(i).get(1);
					vt %= vector.get(i).get(0); 
					if (vt <= 0) {
    
    
						break; 
					}
				}
			}
			if (result < sum) {
    
     
				result = sum;
			} 
		}
		return result; 
	}
}

最后

以上就是关于CSDN编程竞赛第31期的所有题目解析,全部使用了Java来实现,第4题的答案只通过了10%,欢迎一起讨论正确题解哈!大家在比赛时可以选择自己习惯使用的语言来解答即可。

如果有什么问题,我们可以一起交流讨论解决。

最后,希望可以帮助到有需要的码友。

猜你喜欢

转载自blog.csdn.net/guorenhao/article/details/129264191