游游的水果礼包
算法思路
枚举,将获得最后的价值看为一个一元二次方程组ax + by,由此我们可以知道,只要求出x和y的值就可以得到对应的价值,因此我们此处枚举x所有可能的取值,并找到对应的y
注意点
- 我们的x是从0开始的,因为可以有不买一号礼包的情况
- 我们在求x最大次数时,是找Math.min(n/2, m),要找两者的最小值,否则会有负数的情况
- 数据类型应为long,题目中说了数据范围到1e6,因此1e6*1e6可能会溢出,所以用long避免溢出的情况
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long n = scan.nextInt(), m = scan.nextInt(), a = scan.nextInt(), b = scan.nextInt();
long res = 0;
for(int i = 0; i <= Math.min(n/2, m); i++) {
long j = Math.min(n-2*i, (m-i)/2);
res = Math.max(a*i+b*j, res);
}
System.out.println(res);
}
}
买卖股票II
算法思路
贪心;这个题比起Dya01的I的区别时,这题可以无限次进行买卖,所有我们只要股票的价格有上升,就把利润全部拿到手
代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] nums = new int[n];
for(int i = 0; i < n; i++) nums[i] = scan.nextInt();
int res = 0;
for(int i = 1; i < n; i++) {
if(nums[i] > nums[i-1]) res += nums[i] - nums[i-1];
}
System.out.println(res);
}
}
倒置字符串
算法思路
非常简单常规的一道字符串处理题,按照空格分隔字符串,逆序遍历字符串并拼接成一个新字符串即可
注意点
该字符串末尾是没有空格的,因此要单独处理一下,此处采用的是正则表达式来去除的
代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
StringBuffer sb = new StringBuffer();
String[] strings = str.split(" ");
for (int i = (strings.length - 1); i >= 0; i--) sb.append(strings[i] + " ");
String t = sb.toString().replaceAll("\\s+$", "");
sb = new StringBuffer(t);
System.out.println(sb);
}
}