five选手,只做记录,还请多多指教
先引入大佬的解答
https://blog.youkuaiyun.com/qq_22522375/article/details/107771758#comments_12961733
题目:n个朋友,每个人有金币x,有m个房子,每个房子有舒适度和价格,当前仅当这个人金币数大于房子价格时才能购买,每个人至多买一个房子,每个房子最多被一个人买,求最大舒适度;
输入:2 2 // 朋友数:n 房子数:m
2 2 // 朋友1的金币 朋友2的金币
2 2 // 房子1的舒适度 房子1的价格
2 2 // 房子2的舒适度 房子2的价格
输出:4 // 最大舒适度和,即每个人买一个2舒适度的房子
思路:房子按照舒适度从大到小排列,金币从小到大排列,去最小化价格差异买到最大舒适度的房子
import java.util.Arrays;
import java.util.Scanner;
//第一题:n个朋友,每个人有金币x,有m个房子,每个房子有舒适度和价格,当前仅当这个人金币数大于房子价格时才能购买,每个人至多买一个房子,每个房子最多被一个人买,求最大舒适度
public class Main{
public static void main(String []args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //朋友数
int m = sc.nextInt(); //房数
int coin[] = new int[n]; //钱
for (int i = 0; i < n; i++) {
coin[i] = sc.nextInt();
}
int house[][] = new int[m][2]; //第3列用来标记是否卖出
for (int i = 0; i < m; i++) {
for (int j = 0; j < 2; j++) {
house[i][j] = sc.nextInt();
}
}
sortByFitness(house, 0);
Arrays.sort(coin);
// for(int i = 0; i < m; i++) {
// for (int j = 0; j < 2; j++)
// System.out.print(house[i][j] + " ");
// }
int sum = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (coin[j] >= house[i][1]) {
sum += house[i][0];
coin[j] = -1;
break;
}
}
}
System.out.println(sum);
}
//按照第 index列 排序
private static void sortByFitness(int[][] house,int index) {
int row = house.length;
int line = house[0].length;
for (int i = 0; i < row; i++) {
for (int j = i; j < row - 1; j++)
if (house[j][index] < house[j + 1][index]) {
int temp[] = new int[line];
for (int k = 0; k < line; k++)
temp[k] = house[j][k];
house[j] = house[j + 1];
house[j + 1] = temp;
}
}
}
}
题目:给定一个a-f组成的字符串,对其进行删除,要求所有的a在c和e之前且所有的c在e之前,所有的b在d和f之前且所有的d在f之前,求删除后满足串的最大长度
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String []args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
ArrayList<Integer> a1 = new ArrayList<Integer>();
ArrayList<Integer> a2 = new ArrayList<Integer>();
for(int i =0;i<str.length();i++)
if(str.charAt(i) == 'a')
a1.add(0);
else if(str.charAt(i) == 'c')
a1.add(1);
else if(str.charAt(i) == 'e')
a1.add(2);
else if(str.charAt(i) == 'b')
a2.add(0);
else if(str.charAt(i) == 'd')
a2.add(1);
else
a2.add(2);
System.out.println(fun(a1)+fun(a2));
}
private static int fun(ArrayList<Integer> a) {
int ant = 1;
int len = a.size();
if (len == 0)
return 0;
int dp[][] = new int[len][3];
if (a.get(0) == 0)
dp[0][0] = 1;
else if (a.get(0) == 1)
dp[0][1] = 1;
else
dp[0][2] = 1;
for (int i = 1; i < len; i++) {
if (a.get(i) == 0)
dp[i][0] = dp[i - 1][0] + 1;
else if (a.get(i) == 1) //1 只能在 0 或者 1 的后面,选一个最长的放入
dp[i][1] = Math.max(dp[i - 1][0], dp[i - 1][1]) + 1;
else //2 只能在 0、1或者2 的后面,选一个最长的放入
dp[i][2] = Math.max(dp[i - 1][0], Math.max(dp[i - 1][1], dp[i - 1][2])) + 1;
for (int j = 0; j < 3; j++) { //统计目前最长是多少
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j]); //若选择 dp[i-1][j] 相当于删除了 该位置的元素 即不加入
ant = Math.max(ant, dp[i][j]);
}
}
return ant;
}
}
本文探讨两个算法问题:一是通过最优匹配策略,为朋友选购最舒适的房子,以实现整体舒适度最大化;二是对特定字符串进行合理删除操作,以达到最长合法序列的目标。文章提供了详细的代码实现及解析。
5221

被折叠的 条评论
为什么被折叠?



